Cod sursa(job #460616)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 3 iunie 2010 13:41:11
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define Nmax 1005
#define pb push_back
#define INF 2147000000
using namespace std;

vector< int > G[Nmax];
vector< int >::iterator it;
queue< int > Q;
int C[Nmax][Nmax],F[Nmax][Nmax];
int viz[Nmax],prev[Nmax];
int n,m,i,x,y,z,wh;
int fmin,fmax;

inline int Minim(int x,int y){ return x<y ? x:y; }

int BF(){
	memset(viz,0,sizeof(viz));
	Q.push(1); viz[1]=1;
	
	while( ! Q.empty() ){
		x=Q.front();
		if(x != n )
		for(it=G[x].begin(); it!=G[x].end(); ++it)
			if(! viz[*it] && F[x][*it] < C[x][*it]){
				viz[*it]=1;
				prev[*it]=x;
				Q.push(*it);
			}
		Q.pop();
	}
	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);
	}
	
	while( BF() )
		for(it=G[n].begin(); it!=G[n].end(); ++it)
			if( viz[*it] ){
			
				fmin=INF; prev[n]=*it;
				for( wh=n; fmin != 0 && wh!=1; wh=prev[wh])
					fmin=Minim(fmin,C[prev[wh]][wh]-F[prev[wh]][wh]);
				
				if( fmin == 0 ) continue;
				
				for(wh=n; wh!=1; wh=prev[wh]){
					F[prev[wh]][wh] += fmin;
					F[wh][prev[wh]] -= fmin;
				}
			fmax += fmin;
			}
	
	printf("%d\n",fmax);
	fclose(stdin); fclose(stdout);
	return 0;
}