Cod sursa(job #1208196)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 15 iulie 2014 00:36:08
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int> L[5010];
int n,m,i,j,c[1005][1005],x[1005][1005],a,b,q,p,u,C[10000],v[10000],t[10000],vmin,s;
FILE *f,*g;
int bfs(){
    int a,i;
    memset(v,0,sizeof(v));
    u=p=1;
    C[1]=1;
    v[1]=1;
    while(p<=u){
        a=C[p];
        for(i=0;i<L[a].size();i++){
            if(v[L[a][i]]==0 && c[a][L[a][i]]>x[a][L[a][i]]){
                C[++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,&q);
        L[a].push_back(b);
        L[b].push_back(a);
        c[a][b]=q;
    }
    while(bfs()){
        for(i=0;i<L[n].size();i++){
            a=L[n][i];
            if(c[a][n]>x[a][n]&&v[a]==1){
                vmin=c[a][n]-x[a][n];
                while(t[a]!=0){
                    if(c[t[a]][a]-x[t[a]][a]<vmin)
                        vmin=c[t[a]][a]-x[t[a]][a];
                    a=t[a];
                }
                a=L[n][i];
                x[a][n]+=vmin;
                x[n][a]-=vmin;
                while(t[a]!=0){
                    x[a][t[a]]-=vmin;
                    x[t[a]][a]+=vmin;
                    a=t[a];
                }
                s+=vmin;
            }
        }
    }
    fprintf(g,"%d",s);






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