Pagini recente » Cod sursa (job #93153) | Cod sursa (job #2887057) | Cod sursa (job #1028855) | Cod sursa (job #724157) | Cod sursa (job #1637794)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <functional>
using namespace std;
const int oo = 0x1f1f1f1f;
const int maxn = 1e3;
const int maxm = 5e3;
int el[maxm*2];
int cl[maxm*2];
int d[maxn];
vector<int>::iterator cur[maxn];
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<int> al[n];
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 s = 0, t = n-1;
int mf = 0;
function<int(int,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;
};
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);
}