Cod sursa(job #677192)

Utilizator c_adelinaCristescu Adelina c_adelina Data 9 februarie 2012 21:55:14
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#define pb push_back
#include <vector>
#include <cstring>
using namespace std;

vector <int> v[1003];
int t[1003],n,viz[1003],c[1003][1003],f[1003][1003];

int bf()
{
	int d[1003],nr=1;
	memset(viz,0,sizeof(viz));
	d[1]=1;
	for (int i=1;i<=nr;++i)
	{
		int nod=d[i];
		for (vector<int>::iterator it=v[nod].begin();it!=v[nod].end();++it)
			if ((c[nod][*it]!=f[nod][*it]) && (!viz[*it]))
				{t[*it]=nod,viz[*it]=1;
			      if (*it!=n) d[++nr]=*it;
				}
	}
	return viz[n];
}
	
	int main()
{
	int m,fl=0,i,a,b,x;
	
	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",&a,&b,&x);
		c[a][b]=x;
		v[a].pb(b);v[b].pb(a);
	}
	while (bf())
		for (vector <int>::iterator it=v[n].begin();it!=v[n].end();++it)
		if (viz[*it])	
		{
			t[n]=*it;int min=200000;
			for (int nod=n;nod>1;nod=t[nod])
				if (c[t[nod]][nod]-f[t[nod]][nod]<min)
					min=c[t[nod]][nod]-f[t[nod]][nod];
			fl+=min;
			for (int nod=n;nod>1;nod=t[nod])
				f[t[nod]][nod]+=min,f[nod][t[nod]]-=min;
		}
			
printf("%d\n",fl);
return 0;
}