Cod sursa(job #1661329)

Utilizator bogdanpaunFMI Paun Bogdan Gabriel bogdanpaun Data 23 martie 2016 20:00:47
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include <bits/stdc++.h>

using namespace std;

struct nod{
    int y,next;

};


#define sN (sizeof(int)*(N))
#define sM (sizeof(int)*(M))
#define N  (n+2)
#define M  (m+2)
#define Nmax 1005
#define Mmax 10005
int n,m ,x,y,z,pos , sq,eq  , _min,tmp;
int cap[Nmax][Nmax],flux[Nmax][Nmax];
int lst[Nmax],q[Nmax],p[Nmax];
bool use[Nmax];
nod ct[Mmax];
int flow,new_flow;

int main(void)
{
    //freopen("critice.in" , "r" , stdin);
    freopen("maxflow.in" , "r" , stdin);
    scanf("%d %d",&n,&m);

    pos=1;
    for(int i=1;i<=m;++i){
        scanf("%d %d %d", &x ,&y ,&z );
        ++pos;
        ct[pos] = { y , lst[x] };
        lst[x] = pos;
        ++pos;
        ct[pos] = { x , lst[y] };
        lst[y] = pos;
        //cap[x][y] = cap[y][x] = z;
        cap[x][y] = z;
    }


    do{
        new_flow = 0;
        sq = 1,eq=1;
        q[1] = 1;
        memset(use,0,sizeof(use));
        memset(p,0,sizeof(p));
        use[1]=1;
        while( sq <= eq ){
            x = q[sq];      ++sq;
            if(x==n) continue;
            for( z = lst[x] ; z ; z = ct[z].next ){
                y = ct[z].y;
                if( use[y] || cap[x][y] == flux[x][y] ) continue;
                use[y] = 1;
                p[y] = x;
                q[++eq] = y;

            }
        }
        if( !use[n] ) continue;
        for(z =lst[n]; z ; z = ct[z].next){
            y =ct[z].y;
            p[n] = y;
            _min = cap[y][n] - flux[y][n];
            if( !use[y] || _min ==0 ) continue;
            while( p[y] ){
                 tmp = cap[p[y]][y] - flux[p[y]][y];
                 if( tmp < _min ) _min = tmp;
                 y = p[y];
            }
            if( _min <= 0  ) continue;   /*  !!!!!!!!!!! */
            y =n;

            while( p[y] ){
                flux[p[y]][y] += _min;
                flux[y][p[y]] -= _min;
                y = p[y];
            }
            new_flow += _min;

        }

        flow += new_flow;

    }while( new_flow );

    //printf("%d",flow);

    //freopen("critice.out", "w" , stdout);
    freopen("maxflow.out", "w" , stdout);
    printf("%d",flow);

    return 0;
}