Cod sursa(job #1340778)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 12 februarie 2015 00:51:02
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
vector<int>L[1010];
int n,m,a,b,i,s,aa,c[1010][1010],q[100100],v[1010],x[1010][1010],t[1010];
FILE *f,*g;
int bfs(){
    int p=1,u=1;
    for(int i=2;i<=n;i++){
        v[i]=0;
    }
    q[1]=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] ]){
                v[ L[a][i] ]=1;
                q[++u]=L[a][i];
                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(c[a][n] > x[a][n] && v[a]==1 ){
                b = c[a][n] - x[a][n];
                while(t[a]!=0){
                    if(c[ t[a] ][a] > x[ t[a] ][a] )
                        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;
}