Pagini recente » Cod sursa (job #171536) | Cod sursa (job #1667992) | Cod sursa (job #2767471) | Cod sursa (job #2415583) | Cod sursa (job #1616052)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <list>
using namespace std;
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<vector<int>> adjl(n);
vector<vector<int>> C(n, vector<int>(n, 0));
for (int i = 0; i < m; i++) {
int u, v, c;
cin >> u >> v >> c;
u--, v--;
if (C[u][v] == 0 && C[v][u] == 0) {
adjl[u].push_back(v);
adjl[v].push_back(u);
}
C[u][v] += c;
}
int s = 0, t = n-1;
vector<int> d(n, 0);
d[s] = n;
d[t] = 0;
vector<int> e(n, 0);
vector<list<int>> V(2*n);
V[0].assign(adjl[s].begin(), adjl[s].end());
for (int v: adjl[s]) {
e[s] -= e[v] = C[v][s] = C[s][v];
C[s][v] = 0;
}
vector<vector<int>::iterator> cur(n);
for (int u = 0; u < n; u++) {
cur[u] = adjl[u].begin();
}
int k = 0;
while (k >= 0) {
int u = V[k].front();
// printf("%d %d %d %d\n", u, d[u], e[u], *cur[u]);
for (; e[u] > 0 && cur[u] != adjl[u].end(); ++cur[u]) {
int v = *cur[u];
if (C[u][v] == 0 || d[u] <= d[v]) continue;
int f = min(e[u], C[u][v]);
e[u] -= f;
C[u][v] -= f;
C[v][u] += f;
if (e[v] == 0 && v != t) V[d[v]].push_back(v);
e[v] += f;
}
V[k].pop_front();
if (cur[u] == adjl[u].end()) cur[u] = adjl[u].begin();
if (e[u] > 0) {
for (; C[u][*cur[u]] == 0; ++cur[u]);
for (auto it = cur[u]; it != adjl[u].end(); ++it) {
if (C[u][*it] > 0 && d[*cur[u]] > d[*it]) cur[u] = it;
}
d[u] = d[*cur[u]]+1;
V[d[u]].push_back(u);
k = d[u];
}
while (k >= 0 && V[k].empty()) k--;
}
printf("%d\n", e[t]);
}