Cod sursa(job #362663)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 10 noiembrie 2009 16:58:11
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <vector>
#define pb push_back
#define Nmax 1005
#define INF 2000000000
using namespace std;

int c[Nmax][Nmax],f[Nmax][Nmax];
vector< int > G[Nmax];
int n,m,i,x,y,fmin,q,flow,z;
int Q[Nmax], viz[Nmax],tata[Nmax];

int BF(){
	int i,nod;
   vector< int >:: iterator it;
   memset(viz,0,sizeof(viz));
	Q[0]=Q[1]=viz[1]=1;

   for(i=1; i<=Q[0]; ++i){
   	nod=Q[i];
      if( nod == n ) continue;
      for(it=G[nod].begin(); it!=G[nod].end(); it++){
      	if( c[nod][*it] == f[nod][*it] || viz[*it] ) continue;
         viz[*it]=1;
         Q[++Q[0]]=*it;
         tata[*it]=nod;
      }
   }
   return viz[n];
}


int main(){
	freopen("maxflow.in","r",stdin);
   freopen("maxflow.out","w",stdout);
   scanf("%d%d",&n,&m);
   for(i=1;i<=m;++i){
   	scanf("%d%d%d",&x,&y,&z);
      c[x][y]=z;
      G[x].pb(y);
      G[y].pb(x);
   }

   vector< int >:: iterator nod;
   for(  ; BF(); )
   	for(nod=G[n].begin(); nod!=G[n].end(); nod++){

      	if( c[*nod][n] == f[*nod][n] || !viz[*nod] ) continue;
         tata[n] = *nod;

         fmin = INF;
         for( q=n; q!=1; q=tata[q] )
         	fmin = min( fmin, c[tata[q]][q] - f[tata[q]][q] );

         for( q=n; q!=1; q=tata[q] ){
         	f[tata[q]][q] += fmin;
            f[q][tata[q]] -= fmin;
         }

         flow += fmin;
      }

   printf("%d\n",flow);
   fclose(stdin); fclose(stdout);
   return 0;
}