Cod sursa(job #486206)

Utilizator raduzerRadu Zernoveanu raduzer Data 20 septembrie 2010 19:01:31
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

#define pb push_back
#define forit(it, v) for(__typeof(v.begin()) it = v.begin(); it != v.end(); ++it)

const int MAX_N = 1001;
const int INF = 0x3f3f3f3f;

int n, m, sol;
int c[MAX_N][MAX_N], f[MAX_N], up[MAX_N], q[MAX_N];
vector <int> v[MAX_N];

int bf()
{
	memset(f, 0, sizeof(f));
	memset(up, 0, sizeof(up));
	memset(q, 0, sizeof(q));

	f[1] = INF;

	int l , r;

	q[l = r = 1] = 1;

	for (; l <= r; ++l)
	{
		int nod = q[l];

		for (int i = 1; i <= n; ++i)
			if (c[nod][i] && !f[i])
			{
				f[i] = min(f[nod], c[nod][i]);
				up[i] = nod;
				q[++r] = i;
			}
	}

	if (!f[n])
		return 0;

	sol += f[n];

	for (int i = n; i != 1; i = up[i])
	{
		c[up[i]][i] -= f[n];
		c[i][up[i]] += f[n];
	}

	return 1;
}

int main()
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);

	scanf("%d %d", &n, &m);

	for (int i = 1; i <= m; ++i)
	{
		int x, y, z;

		scanf("%d %d %d", &x, &y, &z);

		v[x].pb(y);
		c[x][y] = z;
	}

	int c = 1;
	while (c)
		c = bf();

	printf("%d\n", sol);
}