Cod sursa(job #287509)

Utilizator cotofanaCotofana Cristian cotofana Data 24 martie 2009 22:11:36
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1 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;
	while (!q.empty()) q.pop();
	memset(p, -1, sizeof(p));
	q.push(1);
	p[1]=0;
	while (!q.empty())
	{
		nod=q.front();
		q.pop();
		if (nod==n) continue;
		for (i=1; i<=n; i++)
			if (c[nod][i] && p[i]==-1)
			{
				q.push(i);
				p[i]=nod;
				//if (i==n) return continue;
			}
	}
	return p[n]==-1?0:1;
}

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];
				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;
}