Cod sursa(job #300441)

Utilizator swift90Ionut Bogdanescu swift90 Data 7 aprilie 2009 14:01:40
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 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; 
	for(i=0;i<=n;++i)
		tata[i]=0;
	Q[0]=1;
	p=u=0;
	tata[1]=-1;
	while(p<=u){
		x=Q[p];
		++p;
		if(x==n)
			continue;
		ss=nr[x].size();
		for(i=0;i<ss;++i){
			if(tata[nr[x][i]] || cap[x][nr[x][i]]==flux[x][nr[x][i]])
				continue;
			Q[++u]=nr[x][i];
			tata[nr[x][i]]=x;
		}
	}
	if(tata[n])
		return true;
	return false;
}
inline int minim(int a,int b){
	return a<b?a:b;
}
void fflux(){
	int x;
	while(bf()){
		for(vector<int>::iterator it=nr[n].begin();it!=nr[n].end();++it){
			if(!tata[*it] || cap[*it][n]==flux[*it][n])
				continue;
			x=n;
			rez=1000000000;
			tata[n]=*it;
			while(tata[x]!=-1){
				rez=minim(rez,cap[tata[x]][x]-flux[tata[x]][x]);
				x=tata[x];
			}
			x=n;
			while(tata[x]!=-1){
				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;
}