Cod sursa(job #300394)

Utilizator swift90Ionut Bogdanescu swift90 Data 7 aprilie 2009 13:37:27
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
vector <int> nr[1010];
int n,m,rez;
int cap[1010][1010],flux[1010][1010],tata[1010];
bool bf(){
	int x,ss,i;
	int Q[5010],p,u; 
	vector <bool> viz(1010,false);
	Q[0]=1;
	p=u=0;
	viz[1]=true;
	while(p<=u){
		x=Q[p];
		++p;
		ss=nr[x].size();
		for(i=0;i<ss;++i){
			if(!viz[nr[x][i]] && cap[x][nr[x][i]]>flux[x][nr[x][i]]){
				Q[++u]=nr[x][i];
				viz[nr[x][i]]=true;
				tata[nr[x][i]]=x;
				if(nr[x][i]==n)
					return true;
			}
		}
	}
	return false;
}
void fflux(){
	int x;
	while(bf()){
		x=n;
		rez=1000000000;
		while(tata[x]){
			rez=min(rez,cap[tata[x]][x]-flux[tata[x]][x]);
			x=tata[x];
		}
		x=n;
		while(x){
			flux[tata[x]][x]+=rez;
			flux[x][tata[x]]-=rez;
			x=tata[x];
		}
	}
}
void solve(){
	int i,ss=0;
	for(i=0;i<n;++i)
		ss+=flux[i][n];
	printf("%d\n",ss);
}
int main(){
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	int i,x,y,z;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;++i){
		scanf("%d%d%d",&x,&y,&z);
		nr[x].push_back(y);
		nr[y].push_back(x);
		cap[x][y]+=z;
	}
	fflux();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}