Pagini recente » Cod sursa (job #284395) | Cod sursa (job #3138729) | Cod sursa (job #1234107) | Cod sursa (job #395010) | Cod sursa (job #2690920)
#include <bits/stdc++.h>
using namespace std;
using T = int;
struct Dinic {
struct Edge { int from, to, nxt; T cap, flow; };
vector<Edge> es;
vector<int> graph, at, dist, q;
Dinic(int n) : graph(n, -1) {}
int AddEdge(int a, int b, T c) {
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, 0);
return es.size() - 2;
}
bool bfs(int src, int dest, T need) {
dist.assign(graph.size(), -1); q.clear();
dist[src] = 0; q.push_back(src);
for (int i = 0; i < (int)q.size(); ++i) {
int node = q[i];
for (int ei = graph[node]; ei >= 0; ei = es[ei].nxt) {
const auto &e = es[ei];
if (dist[e.to] == -1 && e.cap - e.flow >= need) {
dist[e.to] = dist[node] + 1;
q.push_back(e.to);
}
}
}
return dist[dest] != -1;
}
bool dfs(int node, int dest, T need) {
if (node == dest) return true;
for (int& ei = at[node]; ei != -1; ei = es[ei].nxt) {
const auto &e = es[ei];
if (dist[e.to] != dist[node] + 1 || e.cap < e.flow + need)
continue;
if (dfs(e.to, dest, need)) {
es[ ei ].flow += need;
es[ei^1].flow -= need;
return true;
}
}
return false;
}
T Compute(int src, int dest) {
T ret = 0;
for (T lim = (1 << 16); lim; lim /= 2) {
while (bfs(src, dest, lim)) {
at = graph;
while (dfs(src, dest, lim))
ret += lim;
}
}
return ret;
}
};
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;
}