Pagini recente » Cod sursa (job #2952462) | Cod sursa (job #3271536) | Cod sursa (job #1833172) | Cod sursa (job #1321673) | Cod sursa (job #2553282)
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");
using pii = pair<int, int>;
const int N = 1e5 + 5;
struct Edge {
int v, cap;
};
vector<int> g[N];
bool f[N];
pii far[N];
vector<Edge> edgs;
int n, m;
static bool bfs() {
deque<int> dq;
f[1] = true;
for (int i = 2; i <= n; ++i)
f[i] = false;
dq.push_back(1);
while (!dq.empty()) {
int u = dq.front();
dq.pop_front();
for (auto i: g[u]) {
if (edgs[i].cap > 0 && !f[edgs[i].v]) {
dq.push_back(edgs[i].v);
f[edgs[i].v] = true;
far[edgs[i].v] = {u, i};
}
}
}
if (f[n])
return true;
return false;
}
int main() {
int ans = 0;
fi >> n >> m;
edgs.reserve(m * 2);
for (int u, v, c, i = 0; i < m; ++i) {
fi >> u >> v >> c;
g[u].push_back(edgs.size());
edgs.push_back({v, c});
g[v].push_back(edgs.size());
edgs.push_back({u, 0});
}
while (bfs()) {
for (auto i: g[n]) {
int minc = edgs[i ^ 1].cap, fiu = edgs[i].v;
if (!f[fiu])
continue;
for (int nod = fiu; nod != 1 && minc > 0; nod = far[nod].x)
minc = min(minc, edgs[far[nod].y].cap);
if (minc <= 0)
continue;
edgs[i].cap+= minc;
edgs[i ^ 1].cap-= minc;
for (int nod = fiu; nod != 1 && minc > 0; nod = far[nod].x) {
edgs[far[nod].y ^ 1].cap+= minc;
edgs[far[nod].y].cap-= minc;
}
ans+= minc;
}
}
fo << ans << '\n';
return 0; }