Cod sursa(job #241240)

Utilizator ProtomanAndrei Purice Protoman Data 9 ianuarie 2009 17:29:56
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define mx 1024

using namespace std;

int flux[mx][mx], capc[mx][mx];
vector <int> ld[mx];
int n, m, x, y, z, flux_max;
int tat[mx];

bool bfs(int s, int d)
{
	int que[mx];
	memset(tat, 0, sizeof(tat));
	que[0] = 1;
	tat[1] = -1;
	for (int p = 0, u = 0; p <= u; p++)
		for (int i = 0, nod = que[p]; i < ld[nod].size(); i++)
		{
			int x = ld[nod][i];
			if (!tat[x] && capc[nod][x] > flux[nod][x])
			{
				que[++u] = x;
				tat[x] = nod;
				if (x == d)
					return 1;
			}
		}
	return 0;
}

int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	scanf("%d %d", &n, &m);
	for (int i = 0; i < m; i++)
	{
		scanf("%d %d %d", &x, &y, &z);
		capc[x][y] = z;
		ld[x].push_back(y);
	}
	for (int r = LONG_MAX; bfs(1, n); flux_max += r)
	{
		for (int i = n; i != 1; i = tat[i])
			r = min(r, capc[tat[i]][i] - flux[tat[i]][i]);
		for (int i = n; i != 1; i = tat[i])
		{
			flux[tat[i]][i] += r;
			flux[i][tat[i]] -= r;
		}
	}
	printf("%d\n", flux_max);
	fclose(stdin);
	fclose(stdout);
	return 0;
}