Pagini recente » Cod sursa (job #712208) | Cod sursa (job #2800470) | Cod sursa (job #2211628) | Cod sursa (job #1256609) | Cod sursa (job #1632372)
#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<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;
function<int(int,int)> dfs = [&] (int u, int c) {
if (u == t) return c;
int fu = 0;
for (int v: adjl[u]) if (d[u] > d[v] && C[u][v] > 0) {
int f = dfs(v, min(c, C[u][v]));
fu += f;
c -= f;
C[u][v] -= f;
C[v][u] += f;
if (c == 0) break;
}
if (c > 0) d[u] = n;
return fu;
};
int mf = 0;
while (true) {
d.assign(n, n);
d[t] = 0;
queue<int> q;
q.push(t);
while (!q.empty()) {
int v = q.front();
q.pop();
for (int u: adjl[v]) if (d[u] == n && C[u][v] > 0) {
d[u] = d[v]+1;
q.push(u);
}
}
if (d[s] == n) break;
mf += dfs(s, oo);
}
printf("%d\n", mf);
}