Cod sursa(job #812127)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 13 noiembrie 2012 15:34:22
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <cstring>
#include <stack>
#include <vector>

using namespace std;

inline int next_int() {int d;scanf("%d", &d);return d;}

const int V = 1 << 10;
const int E = 1 << 14;

int ec, eb[V], en[E], et[E];

int n, m;
int cap[V][V], Q[V], layer[V], from[V];

int bfs(int s, int d) {
	memset(layer, -1, sizeof layer);
	memset(from, -1, sizeof from);
	int front = 0, back = 0;
	Q[back++] = s;
	layer[s] = 0;
	while (back - front > 0) {
		int u = Q[front++];
		for (int e = eb[u]; e != -1; e = en[e]) {
			int v = et[e];
			if (layer[v] == -1 && cap[u][v] > 0) {
				Q[back++] = v;
				from[v] = u;
				layer[v] = layer[u] + 1;
			}
		}
	}
	return layer[d] != -1;
}

int main() {
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	memset(eb, -1, sizeof eb);
	n = next_int();
	m = next_int();
	for (int i = 0; i < m; i++) {
		int u = next_int();
		int v = next_int();
		et[ec] = v;
		en[ec] = eb[u];
		eb[u] = ec++;
		et[ec] = u;
		en[ec] = eb[v];
		eb[v] = ec++;
		cap[u][v] += next_int();
	}
	int flow = 0;
	while (bfs(1, n)) {
		for (int e = eb[n]; e != -1; e = en[e]) {
			int u = et[e];
			if (layer[u] + 1 == layer[n] && cap[u][n] > 0) {
				int f = cap[u][n], where = u;
				while (from[where] != -1) {
					f = min(f, cap[from[where]][where]);
					where = from[where];
				}
				where = u, cap[u][n] -= f, cap[n][u] += f;
				while (from[where] != -1) {
					cap[from[where]][where] -= f;
					cap[where][from[where]] += f;
					where = from[where];
				}
				flow += f;
			}
		}
	}
	printf("%d\n", flow);
	return 0;
}