Cod sursa(job #696349)

Utilizator giuliastefGiulia Stef giuliastef Data 28 februarie 2012 18:10:59
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <cstring>
#include <vector>
#define NMAX 1011
#define INF 1<<30
using namespace std;
vector <int> G[NMAX];
int N, viz[NMAX],c[NMAX][NMAX],f[NMAX][NMAX],t[NMAX],q[NMAX];
void Read(){
     int M,x,y,cost;
     freopen("maxflow.in","r",stdin);
     scanf("%d%d",&N,&M);
     for(;M>0;M--){
      scanf("%d%d%d",&x,&y,&cost);
      G[x].push_back(y);
      G[y].push_back(x);
      c[x][y]=cost;
     }
}
bool BF(){
     int k,i,nod;
     memset(viz,0,sizeof(viz));
     k=1; q[k]=1; viz[1]=1;
     for(i=1;i<=k;i++){
      nod=q[i];
      if(nod==N) continue;
      for(vector <int>::iterator it=G[nod].begin();it!=G[nod].end();it++){
       if(c[nod][*it]==f[nod][*it] || viz[*it]) continue;
       viz[*it]=1;
       q[++k]=*it;
       t[*it]=nod;
      }
     }
     return viz[N];
}
void Solve(){
     freopen("maxflow.out","w",stdout);
     int Flux=0,fmin,i;
     for(; BF();){
      for(vector <int>::iterator it=G[N].begin();it!=G[N].end();it++){
                  if(f[*it][N]==c[*it][N] || !viz[*it]) continue;
                  fmin=INF;
                  t[N]=*it;
                  for(i=N;i!=1;i=t[i])
                   fmin=min(fmin,c[t[i]][i]-f[t[i]][i]);
                  if(!fmin) continue;
                  Flux+=fmin;
                  for(i=N;i!=1;i=t[i]){
                   f[t[i]][i]+=fmin;
                   f[i][t[i]]-=fmin;
                  }
                 }
     }
     printf("%d\n",Flux);
}
int main(){
    Read();
    Solve();
    return 0;
}