Cod sursa(job #421099)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 21 martie 2010 09:49:33
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>
#include <vector>
#define NMAX 1005
#define pb push_back
#define INF 0x3f3f3f3f
using namespace std;
vector <int> A[NMAX];
int n,m,C[NMAX][NMAX],F[NMAX][NMAX];
int flow,fmin,dad[NMAX],Q[NMAX];
char viz[NMAX];
void read()
{
	scanf("%d%d",&n,&m);
	int i,x,y,z;
	for (i=1; i<=m ;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		A[x].pb(y);
		A[y].pb(x);
		C[x][y]=z;
	}
}
inline int min(int x,int y)
{
	return x<y ? x : y;
}
int BF()
{
	Q[0]=1; Q[1]=1;
	memset(viz,0,sizeof(viz));
	viz[1]=1;
	int i,j,nod,vec;
	for (i=1; i<=Q[0]; i++)
	{
		nod=Q[i];
		for (j=0; j<A[nod].size(); j++)
		{
			vec=A[nod][j];
			if (C[nod][vec]==F[nod][vec] || viz[vec])
				continue ;
			viz[vec]=1;
			Q[++Q[0]]=vec;
			dad[vec]=nod;
			if (vec==n)
				return 1;
		}
	}
	return 0;
}
void solve()
{
	int i,nod;
	while (BF())
	{
		for (i=0; i<A[n].size(); i++)
		{
			nod=A[n][i];
			if (F[nod][n]==C[nod][n] || !viz[nod]) 
				continue;
			dad[n]=nod;
			fmin=INF;
			for (nod=n; nod!=1; nod=dad[nod])
				fmin=min(fmin,C[dad[nod]][nod]-F[dad[nod]][nod]);
			for (nod=n; nod!=1; nod=dad[nod])
			{
				F[dad[nod]][nod]+=fmin;
				F[nod][dad[nod]]-=fmin;
			}
			flow+=fmin;
		}
	}
}
int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	read();
	solve();
	printf("%d\n",flow);
	return 0;
}