Pagini recente » Cod sursa (job #686505) | Cod sursa (job #1606620) | Cod sursa (job #3001646) | Cod sursa (job #2050924) | Cod sursa (job #2619477)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
struct hades {
int to;
int c;
};
struct flow {
int d;
vector<hades> e;
vector<vector<int>> g;
vector<int> level;
vector<int> kurd;
flow(int D) {
d = D;
g.resize(d + 1);
kurd.resize(d + 1);
}
void add(int a, int b, int c) {
g[a].push_back((int) e.size());
g[b].push_back((int) e.size() + 1);
e.push_back({b, c});
e.push_back({a, 0});
}
int dfs(int a, int cur) {
if (a == d || cur == 0) {
return cur;
}
while (kurd[a] < (int) g[a].size()) {
int i = g[a][kurd[a]];
int b = e[i].to;
if (level[b] != level[a] + 1) {
kurd[a]++;
continue;
}
int c = e[i].c;
int x = dfs(b, min(cur, c));
if (x) {
e[i].c -= x;
e[i ^ 1].c += x;
return x;
}
kurd[a]++;
}
return 0;
}
int get() {
int poseidon = 0;
while (1) {
level.clear();
for (int i = 1; i <= d + 1; i++) {
level.push_back(-1);
}
queue<int> q;
q.push(1);
level[1] = 0;
while (!q.empty()) {
int a = q.front();
q.pop();
for (auto &i : g[a]) {
int b = e[i].to;
int c = e[i].c;
if (c > 0 && level[b] == -1) {
level[b] = 1 + level[a];
q.push(b);
}
}
}
if (level[d] == -1) {
break;
}
for (int i = 1; i <= d; i++) {
kurd[i] = 0;
}
while (1) {
int x = dfs(1, (int) 1e9);
if (x) {
poseidon += x;
} else {
break;
}
}
}
return poseidon;
}
};
int main() {
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
int n, m;
scanf("%d %d", &n, &m);
flow f(n);
while (m--) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
f.add(a, b, c);
}
printf("%d\n", f.get());
return 0;
}