Pagini recente » Cod sursa (job #444131) | Cod sursa (job #1533013) | Cod sursa (job #2260480) | Cod sursa (job #968208) | Cod sursa (job #1820041)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define SZ(a) (int)(a).size()
typedef int F;
const F oo = 0x3f3f3f3f;
int n;
int t;
vector<vector<pair<int,int>>> al;
vector<F> cl;
vector<int> d;
vector<int> ia;
void ae1(int u, int v, F c) {
al[u].emplace_back(cl.size(), v);
cl.emplace_back(c);
}
void ae(int u, int v, F c) {
ae1(u, v, c);
ae1(v, u, 0);
}
F aug(int u, F c0) {
if (u == t) return c0;
auto c = c0;
for (; c > 0 && ia[u] < SZ(al[u]); ia[u] += c > 0) {
auto e = al[u][ia[u]];
auto i = e.first;
auto v = e.second;
if (d[u] > d[v]) {
auto f = aug(v, min(c, cl[i]));
c -= f;
cl[i] -= f;
cl[i ^ 1] += f;
}
}
return c0-c;
}
F dinic(int s, int t, F c0) {
::t = t;
auto c = c0;
while (c > 0) {
d.assign(n, n);
d[t] = 0;
queue<int> q;
q.push(t);
while (d[s] == n && !q.empty()) {
auto v = q.front();
q.pop();
for (auto e: al[v]) {
auto i = e.first;
auto u = e.second;
if (d[u] == n && cl[i ^ 1] > 0) {
d[u] = d[v]+1;
q.push(u);
}
}
}
if (d[s] == n) break;
ia.assign(n, 0);
c -= aug(s, c);
}
return c0-c;
}
void solve() {
cin >> n;
int m;
cin >> m;
int s = 0;
int t = n-1;
al.assign(n, {});
cl.clear();
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
u--, v--;
F c;
cin >> c;
ae(u, v, c);
}
auto 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();
}