Cod sursa(job #456150)

Utilizator CezarMocanCezar Mocan CezarMocan Data 14 mai 2010 21:39:14
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define maxN 1010
#define maxM 5010
#define inf 0x3f3f3f3f

using namespace std;

vector <int> G[maxN];
int N, M;
int C[maxN][maxN], S, D;
int flux[maxN], up[maxN];
int a, b, c;
int totalFlow, ok;

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

void bfs(int S) {
	int Q[maxN], p, u, nod, fiu;

	p = u = 1;
	Q[1] = S;

	while (p <= u) {
		nod = Q[p];
		for (int i = 0; i < G[nod].size(); i++) {
			fiu = G[nod][i];
			if (flux[fiu] == 0 && C[nod][fiu]) {
				flux[fiu] = min(flux[nod], C[nod][fiu]);
				up[fiu] = nod;
				Q[++u] = fiu;
				if (fiu == D) {
					p = u + 1;
					break;
				}
			}
		}
		p++;
	}

	if (flux[D] == 0) {
		ok = 0;
		return;
	}

	ok = 1; 
	totalFlow += flux[D];

	for (int i = D; i != S; i = up[i]) {
		C[up[i]][i] -= flux[D];
		C[i][up[i]] += flux[D];
	}
}

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

	scanf("%d%d", &N, &M);

	for (int i = 1; i <= M; i++) {
		scanf("%d%d%d", &a, &b, &c);
		G[a].push_back(b);
		C[a][b] = c;
	}

	S = 1; D = N; ok = 1;

	while (ok) {
		ok = 0;
		init();
		bfs(S);
	}

	printf("%d\n", totalFlow);



	return 0;
}