Cod sursa(job #796061)

Utilizator radustn92Radu Stancu radustn92 Data 10 octombrie 2012 15:28:45
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>
#include <bitset>
#include <vector>
#define NMAX 1005
#define INF 1000000000
#define pb push_back
using namespace std;
int n,m,S,D,C[NMAX][NMAX],F[NMAX][NMAX],Q[NMAX],ant[NMAX],rez;
bitset <NMAX> viz;
vector <int> A[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);
		C[x][y]=z;
	}
	S=1; D=n;
}
int flow()
{
	Q[0]=1;  Q[++Q[0]]=S;
	viz.reset(); viz[S]=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 (!viz[vec] && C[nod][vec]-F[nod][vec]>0)
			{
				Q[++Q[0]]=vec;  viz[vec]=1;
				ant[vec]=nod;
				if (viz[D])
					return 1;
			}
		}
	}
	return 0;
}
inline int min(int x,int y)
{
	return x<y ? x : y;
}
void solve()
{
	int nod,fmin;
	while (flow())
	{
		fmin=INF;
		for (nod=D; nod!=S; nod=ant[nod])
			fmin=min(fmin,C[ant[nod]][nod]-F[ant[nod]][nod]);
		for (nod=D; nod!=S; nod=ant[nod])
		{
			F[ant[nod]][nod]+=fmin;
			F[nod][ant[nod]]-=fmin;
		}
		rez+=fmin;
	}
}
int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	read();
	solve();
	printf("%d\n",rez);
	return 0;
}