Pagini recente » Cod sursa (job #2263603) | Cod sursa (job #1130127) | Cod sursa (job #2616804) | Cod sursa (job #582587) | Cod sursa (job #2680247)
#include <bits/stdc++.h>
using namespace std;
struct Dinic {
struct Edge { int to, cap, flow, nxt; };
vector<Edge> es;
vector<int> graph, at, dist, q;
int src = 0, dest = 1;
Dinic(int n) : graph(n, -1), dist(n, -1) {}
void AddEdge(int from, int to, int cap) {
auto add = [&](int from, int to, int cap) {
es.push_back(Edge {to, cap, 0, graph[from]});
graph[from] = es.size() - 1;
};
add(from, to, cap);
add(to, from, 0);
}
bool bfs() {
q.clear();
fill(dist.begin(), dist.end(), -1);
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) {
auto &e = es[ei];
if (dist[e.to] == -1 && e.flow < e.cap)
dist[e.to] = dist[node] + 1, q.push_back(e.to);
}
}
return dist[dest] != -1;
}
int dfs(int node, int flow) {
if (flow == 0) return 0;
if (node == dest) return flow;
while (at[node] != -1) {
int ei = at[node], ret; auto &e = es[ei];
if (dist[e.to] == dist[node] + 1 &&
(ret = dfs(e.to, min(flow, e.cap - e.flow)))) {
es[ ei ].flow += ret;
es[ei^1].flow -= ret;
return ret;
}
at[node] = e.nxt;
}
return 0;
}
int Compute(int src, int dest) {
this->src = src; this->dest = dest; int ret = 0;
while (bfs()) {
at = graph;
while (int flow = dfs(src, 2e9))
ret += flow;
}
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;
}