Cod sursa(job #502199)

Utilizator acelasi7Tudor Maxim acelasi7 Data 18 noiembrie 2010 11:30:36
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream>
using namespace std;
#define NR 500
#define inf 32000
#define min(a,b) (((a)<(b))?(a):(b))
int A[NR][NR],F[NR][NR],viz[NR],n,intr,ies;
int BF();
int FF()
{
	int flux=0,nod,act;
	while(BF())
	{
		nod=ies;
		act=inf;
		while(nod!=intr)
		{
			act=min(act,A[viz[nod]][nod]-F[viz[nod]][nod]);
			nod=viz[nod];
		}
		flux+=act;
		nod=ies;
		while(nod!=intr)
		{
			F[viz[nod]][nod]+=act;
			nod=viz[nod];
		}
	}
	return flux;
}
int BF()
{
	int i,Q[NR],pi,pf,nod;
	memset(viz,0,sizeof viz);
	pi=pf=0;
	Q[pf]=intr;
	while(pf>=pi&&!viz[ies])
	{
		nod=Q[pi];
		for(i=1;i<=n;i++)
		{
			if(A[nod][i]&&F[nod][i]<A[nod][i]&&!viz[i])
			{
				viz[i]=nod;
				Q[++pf]=i;
			}
			else if(A[i][nod]&&F[i][nod])
			{
				viz[i]=-nod;
				Q[++pf]=i;
			}
		}
		pi++;
	}
	return viz[ies];
}
int main()
{
	int x,y,c,m;
	ifstream in("flux.in");
	ofstream out("flux.out");
	in>>n>>m;
	while(in>>x>>y>>c)
		A[x][y]=c;
	intr=1;
	ies=n;
	out<<FF()<<'\n';
	return 0;
}