Cod sursa(job #1824294)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 7 decembrie 2016 17:43:53
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define MAXN 1000
#define INF 2000000000
int cap[MAXN+1][MAXN+1];
int flux[MAXN+1][MAXN+1];
std::vector <int> G[MAXN+1];
int q[MAXN+1];
bool viz[MAXN+1];
int from[MAXN+1];
inline bool BFS(int n){
   int b,e,nod,x;
   memset(viz,0,sizeof(viz));
   memset(from,0,sizeof(from));
   q[0]=1;
   b=0;
   e=1;
   do{
       nod=q[b];
       for(auto x:G[nod])
        if(viz[x]==0&&cap[nod][x]>flux[nod][x]){
           from[x]=nod;
           viz[x]=1;
           q[e++]=x;
        }
       b++;
   }while(b<e&&viz[n]==0);
   return viz[n];
}
int main(){
    FILE*fi,*fout;
    int i,n,m,x,y,z,min;
    long long ans;
    fi=fopen("maxflow.in" ,"r");
    fout=fopen("maxflow.out" ,"w");
    fscanf(fi,"%d %d " ,&n,&m);
    for(i=1;i<=m;i++){
        fscanf(fi,"%d %d %d " ,&x,&y,&z);
        G[x].push_back(y);
        G[y].push_back(x);
        cap[x][y]+=z;
    }
    ans=0;
    while(BFS(n)){
        for(auto nod:G[n])
         if(viz[nod]==1){
            x=nod;
            min=INF;
            while(x!=1){
                if(cap[from[x]][x]-flux[from[x]][x]<min)
                    min=cap[from[x]][x]-flux[from[x]][x];
                x=from[x];
            }
            x=nod;
            while(x!=1){
                flux[from[x]][x]+=min;
                flux[x][from[x]]-=min;
                x=from[x];
            }
            ans+=min;
         }
    }
    fprintf(fout,"%lld" ,ans);
    fclose(fi);
    fclose(fout);
    return 0;
}