EdmondsKarp
Flow algorithm with guaranteed complexity O(VE²). To get edge flow values, compare capacities before and after, and take the positive values only.
36 lines stress-tested
content/graph/EdmondsKarp.h — Chen Xing, source: N/A
template<class T> T edmondsKarp(vector<unordered_map<int, T>>&
graph, int source, int sink) {
assert(source != sink);
T flow = 0;
vi par(sz(graph)), q = par;
for (;;) {
fill(all(par), -1);
par[source] = 0;
int ptr = 1;
q[0] = source;
rep(i,0,ptr) {
int x = q[i];
for (auto e : graph[x]) {
if (par[e.first] == -1 && e.second > 0) {
par[e.first] = x;
q[ptr++] = e.first;
if (e.first == sink) goto out;
}
}
}
return flow;
out:
T inc = numeric_limits<T>::max();
for (int y = sink; y != source; y = par[y])
inc = min(inc, graph[par[y]][y]);
flow += inc;
for (int y = sink; y != source; y = par[y]) {
int p = par[y];
if ((graph[p][y] -= inc) <= 0) graph[p].erase(y);
graph[y][p] += inc;
}
}
}