Cod sursa(job #408707)

Utilizator hasegandaniHasegan Daniel hasegandani Data 3 martie 2010 10:31:32
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>
#include<vector>

using namespace std;

#define Nmax 1005
#define inf 0x3f3f3f3f

int F[Nmax][Nmax],N,flow;
vector <int> l[Nmax];
int c[Nmax],v[Nmax],p[Nmax];

int BF()
{
	memset(v,0,sizeof(v));
	int st,dr,nod;
	c[1]=1;
	v[1]=1;
	
	for(st=dr=1; st<=dr ;++st)
		for(int i=0;i<(int)l[c[st]].size();++i)
		{
			nod=l[c[st]][i];
			if (!v[nod] && F[c[st]][nod])
			{
			c[++dr]=nod;
			p[dr]=st;
			v[nod]=dr;
			}
		}
		
	if (!v[N])
		return 0;
	return 1;
}

void solve()
{
	int min;
	for(; BF() ;)
	{
		min=inf;
		for(int t=v[N]; p[t] ; t=p[t])
			if (min > F[c[p[t]]][c[t]])
				min = F[c[p[t]]][c[t]];
		for(int t=v[N]; p[t] ; t=p[t])
		{
			F[c[p[t]]][c[t]] -= min;
			F[c[t]][c[p[t]]] += min;
		}
		flow += min;
	}
	printf("%d\n",flow);
}

void cit();

int main()
{
	cit();
	solve();
	return 0;
}

void cit()
{
	int a,b,x,M;
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d%d",&N,&M);
	for( ; M ;--M)
	{
		scanf("%d%d%d",&a,&b,&x);
		F[a][b]=x;
		l[a].push_back(b);
		l[b].push_back(a);
	}
}