Cod sursa(job #288098)

Utilizator conttPop Mircea contt Data 25 martie 2009 15:57:03
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda aa Marime 1.09 kb
#include <cstdio>
#include <queue>
#define dim 1100

using namespace std;

int n, m, c[dim][dim], f, precedent[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);
				precedent[i]=nod;
				viz[i]=1;
		
			}
	}
	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])
			{
				precedent[n]=j;
				fm=1<<30;
				for (i=n; i!=1; i=precedent[i])
					if (c[precedent[i]][i]<fm) fm=c[precedent[i]][i];
				if (fm==0) continue;
				for (i=n; i!=1; i=precedent[i])
				{
					c[precedent[i]][i]-=fm;
					//c[i][precedent[i]]+=fm;
				}
				f+=fm;
			}
	printf("%d\n", f);
	return 0;
}