Pagini recente » Cod sursa (job #22403) | Cod sursa (job #2723493) | Cod sursa (job #2704506) | Cod sursa (job #2618498) | Cod sursa (job #2749156)
#include <bits/stdc++.h>
using namespace std;
using T = int;
struct Dinic {
struct Edge { int from, to, nxt; T cap, flow; };
int n;
vector<Edge> es;
vector<int> graph, at, dist, q;
Dinic(int n) : n(n), graph(n, -1) {}
int AddEdge(int a, int b, T c, bool dir = true) {
auto add = [&](int a, int b, T c) {
es.push_back({a, b, graph[a], c, 0});
graph[a] = es.size() - 1;
};
add(a, b, c); add(b, a, dir ? 0 : c);
return es.size() - 2;
}
T dfs(int node, int dest, int d, T need) {
if (!need || node == dest) return need;
if (dist[node] < d) return 0;
dist[node] = d; T ret = 0;
for (int& ei = at[node]; ei != -1; ei = es[ei].nxt) {
const auto &e = es[ei];
if (T now = dfs(e.to, dest, d + 1,
min(need, e.cap - e.flow))) {
es[ ei ].flow += now;
es[ei^1].flow -= now;
ret += now; need -= now;
}
if (!need) break;
}
return ret;
}
T Compute(int src, int dest) {
T ret = 0;
for (int ch = 1; ch--; ) {
at = graph; dist.assign(n, n);
while (T now = dfs(src, dest, 0, numeric_limits<T>::max()))
ret += now, ch = 1;
}
return ret;
}
bool SideOfCut(int x) { return dist[x] == n; }
};
int main() {
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int n, m; cin >> n >> m;
Dinic D(n);
for (int i = 0; i < m; ++i) {
int a, b, c; cin >> a >> b >> c;
D.AddEdge(a - 1, b - 1, c);
}
cout << D.Compute(0, n - 1) << endl;
return 0;
}