Cod sursa(job #935166)

Utilizator swift90Ionut Bogdanescu swift90 Data 1 aprilie 2013 23:02:14
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<cstdio>
#include<vector>
using namespace std;
int N,M;
vector<int> nr[1010];
int F[1010][1010],C[1010][1010],tata[1010];
int Q[2000];
int BF(){
	for(int i=0;i<=N;++i)
		tata[i]=0;
	int p,u,x;
	Q[0]=1;
	tata[1]=1;
	p=u=0;
	while(p<=u){
		x=Q[p++];
		if(x==N)
			continue;
		for(size_t i=0;i<nr[x].size();++i){
			if(!tata[nr[x][i]] && F[x][nr[x][i]]<C[x][nr[x][i]]){
				Q[++u]=nr[x][i];
				tata[nr[x][i]]=x;
			}
		}
	}
	tata[1]=0;
	return tata[N];
}
void solve(){
	while(BF()){
		for(int nod=1;nod<N;++nod){
			if(!tata[nod] || F[nod][N]==C[nod][N])
				continue;
			tata[N]=nod;
			int cur=N,max=1000000000;
			while(tata[cur]){
				if(C[tata[cur]][cur]-F[tata[cur]][cur]<max)
					max=C[tata[cur]][cur]-F[tata[cur]][cur];
				cur=tata[cur];
			}
			if(!max)
				continue;
			cur=N;
			while(tata[cur]){
				F[tata[cur]][cur]+=max;
				F[cur][tata[cur]]-=max;
				cur=tata[cur];
			}
		}
	}
}
int main(){
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	int i,x,y,c;
	scanf("%d%d",&N,&M);
	for(i=0;i<M;++i){
		scanf("%d%d%d",&x,&y,&c);
		C[x][y]=c;
		nr[x].push_back(y);
	}
	solve();
	x=0;
	for(i=1;i<N;++i)
		x+=F[i][N];
	printf("%d\n",x);
	fclose(stdin);
	fclose(stdout);
	return 0;
}