Cod sursa(job #719139)

Utilizator The_DisturbedBungiu Alexandru The_Disturbed Data 21 martie 2012 14:55:07
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<stdio.h>
#include<vector>
using namespace std;
vector<int>g[1024];
int m,n,i,j,k,q,x,y,f[1024][1024],c[1024][1024],t[1024],flux,r;
inline bool bf()
{
	int q[1024],nod;
	bool fol[1024];
	vector<int>::iterator it;
	for(i=2;i<=n;++i)fol[i]=false;;
	q[0]=q[1]=1;
	i=1;
	while(i<=q[0])
	{
		nod=q[i];
		if(nod==n)break;
		for(it=g[nod].begin();it!=g[nod].end();++it)
		{
			if(c[nod][*it]==f[nod][*it] || fol[*it])continue;
			q[++q[0]]=*it;
			t[*it]=nod;
			fol[*it]=1;
		}
		++i;
	}
	return (fol[n]);
}
int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=0;i<m;++i)
	{
		scanf("%d%d%d",&x,&y,&q);
		c[x][y]=q;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	flux=0;
	while(bf())
	{
		r=2000000000;
		for(i=n;i!=1;i=t[i]) if(r>c[t[i]][i]-f[t[i]][i])r=c[t[i]][i]-f[t[i]][i];
		for(i=n;i!=1;i=t[i]) f[t[i]][i]+=r,f[i][t[i]]-=r;
		flux+=r;
	}
	printf("%d\n",flux);
	return 0;
}