From eb518dfef6f4318f4a6f61aba188842cb34748dc Mon Sep 17 00:00:00 2001 From: subcrip Date: Sun, 19 May 2024 15:58:06 +0800 Subject: [PATCH] Add graph/examples/minimum_flow_with_demands.cc Signed-off-by: subcrip --- graph/examples/minimum_flow_with_demands.cc | 41 +++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 graph/examples/minimum_flow_with_demands.cc diff --git a/graph/examples/minimum_flow_with_demands.cc b/graph/examples/minimum_flow_with_demands.cc new file mode 100644 index 0000000..711e3fb --- /dev/null +++ b/graph/examples/minimum_flow_with_demands.cc @@ -0,0 +1,41 @@ +struct dinic { + // ... +}; + +void solve() { + read(int, n, m, s, t); + dinic net(n + 1); + int S = 0, T = n + 1; + vector init(n + 1); + for (int i = 0 ;i < m; ++i) { + read(ll, u, v, lower, upper); + init[v] += lower; + init[u] -= lower; + net.add_edge(u, v, upper - lower); + } + ll sum = 0; + for (int i =1; i <= n; ++i) { + if (init[i] > 0) { + net.add_edge(S, i, init[i]); + sum += init[i]; + } else if (init[i] < 0) { + net.add_edge(i, T, -init[i]); + } + } + net.add_edge(t, s, INFLL, 1, 1); // WARN: s->t is wrong + if (sum != net.run(S, T)) { + cout << "please go home to sleep\n"; + } else { + int m = net.edges[t].size(); + int curr; + for (int i = 0; i < m; ++i) { + if (net.edges[t][i].mark) { + net.edges[t][i].cap = 0; + net.edges[net.edges[t][i].to][net.edges[t][i].rev].cap = 0; + curr = net.edges[t][i].flow; // WARN: real flow + break; + } + } + cout << curr - net.run(t, s) << '\n'; + } +}