Cod sursa(job #247207)

Utilizator ProtomanAndrei Purice Protoman Data 22 ianuarie 2009 15:23:08
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define mx 1024

using namespace std;

int flux[mx][mx], capc[mx][mx];
int n, m, x, y, z;
int tat[mx];

bool bfs(int s, int d)
{
	int que[mx];
	memset(tat, 0, sizeof(tat));
	tat[que[0] = 1] = -1;

	for (int p = 0, u = 0; p <= u; p++)
		for (int i = 1, nod = que[p]; i <= n; i++)
			if (!tat[i] && capc[nod][i] > flux[nod][i])
			{
				tat[que[++u] = i] = nod;
				if (i == d)
					return 1;
			}

	return 0;
}

int flux_maxim()
{
	int flux_max = 0, r;
	for (; bfs(1, n); )
		for (int i = 1; i <= n; i++)
		{
			if (tat[i] <= 0 || capc[i][n] <= flux[i][n])
				continue;
			r = capc[i][n] - flux[i][n];

			for (int j = i; j != 1; j = tat[j])
				r = min(r, capc[tat[j]][j] - flux[tat[j]][j]);

			if (!r)
				continue;
			flux[i][n] += r;
			flux[n][i] -= r;

			for (int j = i; j != 1; j = tat[j])
			{
				flux[tat[j]][j] += r;
				flux[j][tat[j]] -= r;
			}

			flux_max += r;
		}
	return flux_max;
}

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;
	}
	printf("%d\n", flux_maxim());
	fclose(stdin);
	fclose(stdout);
	return 0;
}