Cod sursa(job #1511302)

Utilizator DeltaMTP Dragos DeltaM Data 26 octombrie 2015 13:01:23
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int>L[1010];
int n,m,i,j,a,aa,aaa,s,v[1010],q[1001000],c[1010][1010],x[1010][1010],t[1010];
FILE *f,*g;
int bfs(){
    int p=1,u=1;
    memset(v,0,sizeof(v));
    q[1]=1;
    v[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,&aa,&aaa);
        L[a].push_back(aa);
        L[aa].push_back(a);
        c[a][aa]=aaa;
    }
    while(bfs()){
        for(i=0;i<L[n].size();i++){
            a=L[n][i];
            if(x[a][n]<c[a][n] && v[a]==1){
                aa=c[a][n]-x[a][n];
                while(t[a]!=0){
                    if( c[ t[a] ][a] - x[ t[a] ][a] < aa)
                        aa = c[ t[a] ][a] - x[ t[a] ][a];
                    a=t[a];
                }
                a=L[n][i];
                x[a][n]+=aa;
                x[n][a]-=aa;
                while(t[a]!=0){
                    x[ t[a] ][a]+=aa;
                    x[a][ t[a] ]-=aa;
                    a=t[a];
                }
                s+=aa;
            }
        }
    }
    fprintf(g,"%d",s);

    fclose(f);
    fclose(g);
    return 0;
}