Cod sursa(job #318457)

Utilizator CezarMocanCezar Mocan CezarMocan Data 28 mai 2009 16:49:27
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <cstring>
#define maxn 1001
#define inf 2000000000

using namespace std;

int n, m, i, j, k, p, u, a, b, cc;
int c[maxn][maxn];
int flux[maxn], up[maxn], q[maxn], futot;
int ok;

void init() {
	memset(flux, 0, sizeof(flux));
	flux[1] = inf;
	memset(up, -1, sizeof(up));
}

inline int min(int a, int b) {
	if (a < b)
		return a;
	return b;
}

bool bfs() {
	int nod, fiu, p, u, i;
	p = u = 1;
	q[1] = 1;
	while (p <= u) {
		nod = q[p];
		for (i = 1; i <= n; i++) 
			if (c[nod][i] > 0) {
				fiu = i;
				if (flux[fiu] == 0) {
					flux[fiu] = min(c[nod][i], flux[nod]);
					up[fiu] = nod;
					u++;
					q[u] = fiu;
				}
			}
		p++;
	}
	
	if (!flux[n])
		return false;
	
	futot += flux[n];
	nod = n;
	while (nod != 1) {
		fiu = up[nod];
		c[fiu][nod] -= flux[n];
		c[nod][fiu] += flux[n];
		nod = up[nod];
	}
	
	return true;
}

int main() {
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	
	scanf("%d%d", &n, &m);
	for (i = 1; i <= m; i++) {
		scanf("%d%d%d", &a, &b, &cc);
		c[a][b] = cc;
	}
	
	ok = 1;
	while (ok) {
		init();
		ok = bfs();
	}
	
	printf("%d\n", futot);
	
	return 0;
}