Cod sursa(job #1651072)

Utilizator howsiweiHow Si Wei howsiwei Data 12 martie 2016 01:10:09
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

const int oo = 0x3f3f3f3f;
int n;
int t;
vector<vector<int>> al;
vector<int> el;
vector<int> cl;
vector<int> d;
vector<int> ia;

void ae1(int u, int v, int c) {
	al[u].push_back(el.size());
	el.push_back(v);
	cl.push_back(c);
}

void ae(int u, int v, int c) {
	ae1(u, v, c);
	ae1(v, u, 0);
}

int aug(int u, int oc) {
	if (u == t) return oc;
	int c = oc;
	for (; c > 0 && ia[u] < int(al[u].size()); ia[u]++) {
		int i = al[u][ia[u]];
		if (!(d[u] > d[el[i]] && cl[i] > 0)) continue;
		int f = aug(el[i], min(c, cl[i]));
		c -= f;
		cl[i] -= f;
		cl[i^1] += f;
	}
	if (c > 0) d[u] = n;
	return oc-c;
}

int dinic(int s, int t, int oc) {
	::t = t;
	int c = oc;
	while (c > 0) {
		d.assign(n, n);
		d[t] = 0;
		queue<int> q;
		q.push(t);
		do {
			int v = q.front();
			q.pop();
			if (v == s) break;
			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;
		ia.assign(n, 0);
		c -= aug(s, c);
	}
	return oc-c;
}

void solve() {
	cin >> n;
	int m;
	cin >> m;
	int s = 0;
	int t = n-1;
	al.assign(n, {});
	el.clear();
	cl.clear();
	for (int i = 0; i < m; i++) {
		int u, v, c;
		cin >> u >> v >> c;
		u--, v--;
		ae(u, v, c);
	}
	int mf = dinic(s, t, oo);
	printf("%d\n", mf);
}

int main() {
#ifdef INFOARENA
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
#endif
	cin.sync_with_stdio(false);
	solve();
}