Cod sursa(job #1756115)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 11 septembrie 2016 21:44:12
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define MAXN 1000
#define INF 1000000000
std::vector <int> G[MAXN+1];
int cap[MAXN+1][MAXN+1],flux[MAXN+1][MAXN+1];
char viz[MAXN+1];
int q[MAXN+1];
int tata[MAXN+1];
inline void add_Edge(int x,int y){
    G[x].push_back(y);
}
int n;
inline char BFS(){
   int b,e,i,nod;
   memset(viz,0,sizeof(viz));
   q[0]=1;
   viz[1]=1;
   b=0;
   e=1;
   do{
       nod=q[b];
       for(i=0;i<G[nod].size();i++)
         if(viz[G[nod][i]]==0&&cap[nod][G[nod][i]]>flux[nod][G[nod][i]]){
             viz[G[nod][i]]=1;
             if(G[nod][i]!=n){
                tata[G[nod][i]]=nod;
                q[e]=G[nod][i];
                e++;
             }
         }
       b++;
   }while(b<e);
   return viz[n];
}
int main(){
   FILE*fi,*fout;
   int m,x,y,z,min,ans,nod,i;
   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);
      add_Edge(x,y);
      add_Edge(y,x);
      cap[x][y]=z;
      cap[y][x]=0;
   }
   ans=0;
   while(BFS()){
       for(i=0;i<G[n].size();i++)
         if(viz[G[n][i]]==1&&cap[G[n][i]][n]>flux[G[n][i]][n]){
             tata[n]=G[n][i];
             nod=n;
             min=INF;
             while(nod>1){
                 if(min>cap[tata[nod]][nod]-flux[tata[nod]][nod])
                   min=cap[tata[nod]][nod]-flux[tata[nod]][nod];
                  nod=tata[nod];
             }
             nod=n;
             while(nod>1){
                  flux[tata[nod]][nod]+=min;
                  flux[nod][tata[nod]]-=min;
                  nod=tata[nod];
             }
             ans+=min;
         }
   }
   fprintf(fout,"%d" ,ans);
   fclose(fi);
   fclose(fout);
   return 0;
}