Cod sursa(job #1628787)

Utilizator SmaugSmaug . Smaug Data 4 martie 2016 10:34:52
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<cstdio>
#include<vector>
using namespace std;
vector<int>L[10100];
int n,m,i,j,a,b,aa,s,c[1010][1010],v[1010],x[1010][1010],t[1010],q[100100];
FILE *f,*g;
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
int bfs(){
    for(i=1;i<=n;i++){
        v[i]=0;
    }
    v[1]=1;
    q[1]=1;
    int p=1,u=1;
    while(p<=u){
        a=q[p];
        for(int i=0;i<L[a].size();i++){
            if( v[ L[a][i] ] == 0 && c[a][ L[a][i] ] > x[a][ L[a][i] ] ){
                q[++u]=L[a][i];
                v[ L[a][i] ] = 1;
                t[ L[a][i] ] = a;
            }
        }
        p++;
    }
    return v[n];
}
int main(){
    f=fopen("maxflow.in","r");
    g=fopen("maxflow.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d%d",&a,&b,&aa);
        L[a].push_back(b);
        L[b].push_back(a);
        c[a][b]=aa;
    }
    while( bfs() ){
        for(i=0;i<L[n].size();i++){
            a=L[n][i];
            if( v[a] && c[a][n] > x[a][n] ){
                b=c[a][n]-x[a][n];
                while(t[a] != 0){
                    b = minim( b , c[ t[a] ][a] - x[ t[a] ][a] );
                    a=t[a];
                }
                a=L[n][i];
                x[a][n] += b;
                x[n][a] -= b;
                while( t[a] != 0 ){
                    x[ t[a] ][a] += b;
                    x[a][ t[a] ] -= b;
                    a=t[a];
                }
                s+=b;
            }
        }
    }
    fprintf(g,"%d",s);
 
 
 
 
 
 
 
    fclose(f);
    fclose(g);
    return 0;
}