Cod sursa(job #1638658)

Utilizator howsiweiHow Si Wei howsiwei Data 8 martie 2016 01:54:08
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <functional>
using namespace std;
const int oo = 0x1f1f1f1f;
const int maxn = 1e3;
const int maxm = 1e4;
vector<int> al[maxn];
int el[maxm];
int cl[maxm];
int d[maxn];
vector<int>::iterator cur[maxn];
int n, m;
int s, t;

int dfs(int u, int c0) {
	if (u == t) return c0;
	int c = c0;
	for (; cur[u] != al[u].end(); ++cur[u]) {
		int i = *cur[u];
		if (!(d[u] > d[el[i]] && cl[i] > 0)) continue;
		int f = dfs(el[i], min(c, cl[i]));
		c -= f;
		cl[i] -= f;
		cl[i^1] += f;
		if (c == 0) break;
	}
	if (c > 0) d[u] = n;
	return c0-c;
}

int main() {
#ifdef INFOARENA
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
#endif
	cin.sync_with_stdio(false);
	cin >> n >> m;
	s = 0, t = n-1;
	for (int i = 0; i < m; i++) {
		int u, v, c;
		cin >> u >> v >> c;
		u--, v--;
		int idx = i*2;
		al[u].push_back(idx);
		el[idx] = v;
		cl[idx] = c;
		idx++;
		al[v].push_back(idx);
		el[idx] = u;
		cl[idx] = 0;
		idx++;
	}
	int mf = 0;
	while (true) {
		for (int u = 0; u < n; u++) d[u] = n;
		d[t] = 0;
		queue<int> q;
		q.push(t);
		do {
			int v = q.front();
			q.pop();
			cur[v] = al[v].begin();
			for (int i: al[v]) if (d[el[i]] == n && cl[i^1] > 0) {
				d[el[i]] = d[v]+1;
				q.push(el[i]);
			}
		} while (!q.empty());
		if (d[s] == n) break;
		mf += dfs(s, oo);
	}
	printf("%d\n", mf);
}