Pagini recente » Cod sursa (job #1031799) | Cod sursa (job #1990406) | Cod sursa (job #991936) | Cod sursa (job #1728217) | Cod sursa (job #1614733)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int main() {
cin.sync_with_stdio(false);
#ifdef INFOARENA
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
#endif
int n, m;
cin >> n >> m;
vector<vector<int>> adjl(n);
vector<vector<int>> adjm(n, vector<int>(n, 0));
for (int i = 0; i < m; i++) {
int u, v, c;
cin >> u >> v >> c;
u--, v--;
if (adjm[u][v] == 0 && adjm[v][u] == 0) {
adjl[u].push_back(v);
adjl[v].push_back(u);
}
adjm[u][v] += c;
}
int s = 0, t = n-1;
int flow = 0;
while (true) {
vector<int> p(n, -1);
p[s] = -2;
vector<int> pts;
queue<int> q;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v: adjl[u]) if (p[v] == -1 && adjm[u][v] > 0) {
if (v == t) pts.push_back(u);
else p[v] = u, q.push(v);
}
}
if (pts.empty()) break;
for (int u: pts) {
p[t] = u;
int c = adjm[u][t];
for (int v = u; v != s; v = p[v]) {
c = min(c, adjm[p[v]][v]);
}
for (int v = t; v != s; v = p[v]) {
adjm[p[v]][v] -= c;
adjm[v][p[v]] += c;
}
flow += c;
}
}
printf("%d\n", flow);
}