Cod sursa(job #501162)

Utilizator AnkutzaAnca Ioana Ankutza Data 14 noiembrie 2010 14:25:41
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <cstdio>
#include <vector>

using namespace std;
#define NMAX 1024
#define vii vector<vector<int> >
#define vi vector<int>
#define pb(a) push_back(a)

int N; // numarul de noduri
int C[NMAX][NMAX]; //capacitati
int F[NMAX][NMAX]; //flow
vii G; // graful ( adiacentele)
int coada[NMAX]; // coada pt bfs
int viz[NMAX];   // vizitati
int BFS[NMAX];   // BFS-ul
inline int bfs(int sursa, int sink) {
	for (int i = 1; i <= N; ++i) viz[i] = 0;
	coada[0] = 0;
	// pleaca de la sursa
	coada[++coada[0]] = sursa;
	viz[sursa] = 1;
	for (int i = 1; i <= coada[0]; ++i) {
		int nod = coada[i];
		if (nod == sink) continue;
		for (int j = 0; j < G[nod].size(); ++j) {
			int nod2 = G[nod][j];
			if (C[nod][nod2] == F[nod][nod2] || viz[nod2]) continue;
			viz[nod2] = 1;
			coada[++coada[0]] = nod2;
			BFS[nod2] = nod;
		}
	}
	return viz[sink];
}
int max_flow(int sursa, int sink) {
	int flow = 0;
	while (bfs(sursa, sink)) {
		for (int i = 0; i < G[sink].size(); ++i) {
			int nod = G[sink][i];
			if (F[nod][sink] == C[nod][sink] || !viz[nod]) continue;
			int cresc = C[nod][sink] - F[nod][sink];
			BFS[sink] = nod;
			for (nod = sink; nod != sursa; nod = BFS[nod])
				cresc = min(cresc, C[BFS[nod]][nod] - F[BFS[nod]][nod]);
			if (cresc == 0) continue;
			for (nod = sink; nod != sursa; nod = BFS[nod]) {
				F[BFS[nod]][nod] += cresc;
				F[nod][BFS[nod]] -= cresc;
			}
			flow += cresc;
		}
	}
	return flow;
} 
int main() {
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);

	int M;
	scanf("%d %d", &N, &M);
	G.resize(N+1);	
	while (M--) {
		int a, b, c;
		scanf("%d %d %d", &a, &b, &c);
		C[a][b] += c;
		G[a].pb(b); G[b].pb(a);
	}
	printf("%d\n", max_flow(1, N));
	return 0;
}