Cod sursa(job #287580)

Utilizator cotofanaCotofana Cristian cotofana Data 24 martie 2009 23:06:37
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>
#include <queue>
#define dim 1100

using namespace std;

int n, m, c[dim][dim], f, p[dim];
queue<int> q;

bool bfs()
{
	int nod, i, viz[dim];
	while (!q.empty()) q.pop();
	memset(viz, 0, sizeof(viz));
	q.push(1);
	viz[1]=1;
	while (!q.empty())
	{
		nod=q.front();
		q.pop();
		if (nod==n) continue;
		for (i=1; i<=n; i++)
			if (c[nod][i] && !viz[i])
			{
				q.push(i);
				p[i]=nod;
				viz[i]=1;
				//if (i==n) return continue;
			}
	}
	return viz[n];
}

int main()
{
	int i, x, y, z, fm, j;
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	scanf("%d %d\n", &n, &m);
	for (i=1; i<=m; i++)
	{
		scanf("%d %d %d\n", &x, &y, &z);
		c[x][y]=z;
	}
	
	for (f=0; bfs();)
		for (j=1; j<n; j++)
			if (c[j][n])
			{
				p[n]=j;
				fm=1<<30;
				for (i=n; i!=1; i=p[i])
					if (c[p[i]][i]<fm) fm=c[p[i]][i];
				if (fm==0) continue;
				for (i=n; i!=1; i=p[i])
				{
					c[p[i]][i]-=fm;
					c[i][p[i]]+=fm;
				}
				f+=fm;
			}
	printf("%d\n", f);
	return 0;
}