From 05a53a8dadb113a9b78393fdbe0f493b44239c5e Mon Sep 17 00:00:00 2001 From: subcrip Date: Sat, 18 May 2024 19:52:41 +0800 Subject: [PATCH] Add graph/edmonds-karp.cc Signed-off-by: subcrip --- graph/edmonds-karp.cc | 55 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 graph/edmonds-karp.cc diff --git a/graph/edmonds-karp.cc b/graph/edmonds-karp.cc new file mode 100644 index 0000000..6c2acc8 --- /dev/null +++ b/graph/edmonds-karp.cc @@ -0,0 +1,55 @@ +struct edmonds_karp { + struct edge { + int to; + ll cap; + ll flow; + pair rev; + }; + + vector> edges; + + edmonds_karp(int n) : edges(n + 1) {} + + void add_edge(int from, int to, ll cap) { + edges[from].push_back({to, cap, 0, make_pair(to, int(edges[to].size()))}); + edges[to].push_back({from, 0, 0, make_pair(from, int(edges[from].size() - 1))}); + } + + ll run(int s, int t) { + int n = edges.size(); + vector pa_(n + 1); + ll res = 0; + while (1) { + vector pf(n + 1); + deque dq; + dq.emplace_back(s); + pf[s] = LLONG_MAX; + while (dq.size()) { + int v = dq.front(); dq.pop_front(); + for (auto&& [i, ne] : enumerate(edges[v])) { + if (pf[ne.to] == 0 and ne.cap > ne.flow) { + pf[ne.to] = min(pf[v], ne.cap - ne.flow); + pa_[ne.to] = {v, i}; + dq.emplace_back(ne.to); + } + } + if (pf[t] != 0) { + break; + } + } + if (pf[t] == 0) { + break; + } + int p = t; + while (pa_[p].first != 0) { + auto [x, y] = pa_[p]; + edges[x][y].flow += pf[t]; + auto [z, w] = edges[x][y].rev; + edges[z][w].flow -= pf[t]; + p = x; + } + res += pf[t]; + } + return res; + } +};