Cod sursa(job #1633974)

Utilizator howsiweiHow Si Wei howsiwei Data 6 martie 2016 13:05:57
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <functional>
using namespace std;
const int oo = 0x1f1f1f1f;

int main() {
#ifdef INFOARENA
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
#endif
	cin.sync_with_stdio(false);
	int n, m;
	cin >> n >> m;
	vector<pair<int,int>> el;
	vector<vector<int>> al(n);
	for (int i = 0; i < m; i++) {
		int u, v, c;
		cin >> u >> v >> c;
		u--, v--;
		el.emplace_back(c, v);
		al[u].push_back(el.size()-1);
		el.emplace_back(0, u);
		al[v].push_back(el.size()-1);
	}
	int s = 0, t = n-1;
	vector<int> d;
	vector<vector<int>::iterator> cur(n);
	function<int(const int,const int)> dfs = [&] (const int u, const int c0) {
		if (u == t) return c0;
		int c = c0;
		for (; cur[u] != al[u].end(); ++cur[u]) {
			int i = *cur[u];
			int v = el[i].second;
			int& cuv = el[i].first;
			if (!(d[u] > d[v] && cuv > 0)) continue;
			int f = dfs(v, min(c, cuv));
			c -= f;
			cuv -= f;
			el[i^1].first += f;
			if (c == 0) break;
		}
		if (c > 0) d[u] = n;
		return c0-c;
	};
	int mf = 0;
	while (true) {
		d.assign(n, 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]) {
				int u = el[i].second;
				if (d[u] == n && el[i^1].first > 0) {
					d[u] = d[v]+1;
					q.push(u);
				}
			}
		} while (!q.empty());
		if (d[s] == n) break;
		mf += dfs(s, oo);
	}
	printf("%d\n", mf);
}