1#![allow(dead_code)]
2use crate::internal_queue::SimpleQueue;
3use crate::internal_type_traits::Integral;
4use std::cmp::min;
5use std::iter;
6
7impl<Cap> MfGraph<Cap>
8where
9 Cap: Integral,
10{
11 pub fn new(n: usize) -> MfGraph<Cap> {
12 MfGraph {
13 _n: n,
14 pos: Vec::new(),
15 g: iter::repeat_with(Vec::new).take(n).collect(),
16 }
17 }
18
19 pub fn add_edge(&mut self, from: usize, to: usize, cap: Cap) -> usize {
20 assert!(from < self._n);
21 assert!(to < self._n);
22 assert!(Cap::zero() <= cap);
23 let m = self.pos.len();
24 self.pos.push((from, self.g[from].len()));
25 let rev = self.g[to].len() + usize::from(from == to);
26 self.g[from].push(_Edge { to, rev, cap });
27 let rev = self.g[from].len() - 1;
28 self.g[to].push(_Edge {
29 to: from,
30 rev,
31 cap: Cap::zero(),
32 });
33 m
34 }
35}
36
37#[derive(Clone, Debug, PartialEq, Eq)]
38pub struct Edge<Cap: Integral> {
39 pub from: usize,
40 pub to: usize,
41 pub cap: Cap,
42 pub flow: Cap,
43}
44
45impl<Cap> MfGraph<Cap>
46where
47 Cap: Integral,
48{
49 pub fn get_edge(&self, i: usize) -> Edge<Cap> {
50 let m = self.pos.len();
51 assert!(i < m);
52 let _e = &self.g[self.pos[i].0][self.pos[i].1];
53 let _re = &self.g[_e.to][_e.rev];
54 Edge {
55 from: self.pos[i].0,
56 to: _e.to,
57 cap: _e.cap + _re.cap,
58 flow: _re.cap,
59 }
60 }
61 pub fn edges(&self) -> Vec<Edge<Cap>> {
62 let m = self.pos.len();
63 (0..m).map(|i| self.get_edge(i)).collect()
64 }
65 pub fn change_edge(&mut self, i: usize, new_cap: Cap, new_flow: Cap) {
66 let m = self.pos.len();
67 assert!(i < m);
68 assert!(Cap::zero() <= new_flow && new_flow <= new_cap);
69 let (to, rev) = {
70 let _e = &mut self.g[self.pos[i].0][self.pos[i].1];
71 _e.cap = new_cap - new_flow;
72 (_e.to, _e.rev)
73 };
74 let _re = &mut self.g[to][rev];
75 _re.cap = new_flow;
76 }
77
78 pub fn flow(&mut self, s: usize, t: usize) -> Cap {
80 self.flow_with_capacity(s, t, Cap::max_value())
81 }
82 pub fn flow_with_capacity(&mut self, s: usize, t: usize, flow_limit: Cap) -> Cap {
86 let n_ = self._n;
87 assert!(s < n_);
88 assert!(t < n_);
89 assert_ne!(s, t);
98 assert!(Cap::zero() <= flow_limit);
100
101 let mut calc = FlowCalculator {
102 graph: self,
103 s,
104 t,
105 flow_limit,
106 level: vec![0; n_],
107 iter: vec![0; n_],
108 que: SimpleQueue::default(),
109 };
110
111 let mut flow = Cap::zero();
112 while flow < flow_limit {
113 calc.bfs();
114 if calc.level[t] == -1 {
115 break;
116 }
117 calc.iter.iter_mut().for_each(|e| *e = 0);
118 while flow < flow_limit {
119 let f = calc.dfs(t, flow_limit - flow);
120 if f == Cap::zero() {
121 break;
122 }
123 flow += f;
124 }
125 }
126 flow
127 }
128
129 pub fn min_cut(&self, s: usize) -> Vec<bool> {
130 let mut visited = vec![false; self._n];
131 let mut que = SimpleQueue::default();
132 que.push(s);
133 while let Some(&p) = que.pop() {
134 visited[p] = true;
135 for e in &self.g[p] {
136 if e.cap != Cap::zero() && !visited[e.to] {
137 visited[e.to] = true;
138 que.push(e.to);
139 }
140 }
141 }
142 visited
143 }
144}
145
146struct FlowCalculator<'a, Cap> {
147 graph: &'a mut MfGraph<Cap>,
148 s: usize,
149 t: usize,
150 flow_limit: Cap,
151 level: Vec<i32>,
152 iter: Vec<usize>,
153 que: SimpleQueue<usize>,
154}
155
156impl<Cap> FlowCalculator<'_, Cap>
157where
158 Cap: Integral,
159{
160 fn bfs(&mut self) {
161 self.level.iter_mut().for_each(|e| *e = -1);
162 self.level[self.s] = 0;
163 self.que.clear();
164 self.que.push(self.s);
165 while let Some(&v) = self.que.pop() {
166 for e in &self.graph.g[v] {
167 if e.cap == Cap::zero() || self.level[e.to] >= 0 {
168 continue;
169 }
170 self.level[e.to] = self.level[v] + 1;
171 if e.to == self.t {
172 return;
173 }
174 self.que.push(e.to);
175 }
176 }
177 }
178 fn dfs(&mut self, v: usize, up: Cap) -> Cap {
179 if v == self.s {
180 return up;
181 }
182 let mut res = Cap::zero();
183 let level_v = self.level[v];
184 for i in self.iter[v]..self.graph.g[v].len() {
185 self.iter[v] = i;
186 let &_Edge {
187 to: e_to,
188 rev: e_rev,
189 ..
190 } = &self.graph.g[v][i];
191 if level_v <= self.level[e_to] || self.graph.g[e_to][e_rev].cap == Cap::zero() {
192 continue;
193 }
194 let d = self.dfs(e_to, min(up - res, self.graph.g[e_to][e_rev].cap));
195 if d <= Cap::zero() {
196 continue;
197 }
198 self.graph.g[v][i].cap += d;
199 self.graph.g[e_to][e_rev].cap -= d;
200 res += d;
201 if res == up {
202 return res;
203 }
204 }
205 self.iter[v] = self.graph.g[v].len();
206 res
207 }
208}
209
210#[derive(Clone, Debug, Default)]
211pub struct MfGraph<Cap> {
212 _n: usize,
213 pos: Vec<(usize, usize)>,
214 g: Vec<Vec<_Edge<Cap>>>,
215}
216
217#[derive(Clone, Debug)]
218struct _Edge<Cap> {
219 to: usize,
220 rev: usize,
221 cap: Cap,
222}
223
224#[cfg(test)]
225mod test {
226 use crate::{Edge, MfGraph};
227
228 #[test]
229 fn test_max_flow_wikipedia() {
230 let mut graph = MfGraph::new(6);
233 assert_eq!(graph.add_edge(0, 1, 3), 0);
234 assert_eq!(graph.add_edge(0, 2, 3), 1);
235 assert_eq!(graph.add_edge(1, 2, 2), 2);
236 assert_eq!(graph.add_edge(1, 3, 3), 3);
237 assert_eq!(graph.add_edge(2, 4, 2), 4);
238 assert_eq!(graph.add_edge(3, 4, 4), 5);
239 assert_eq!(graph.add_edge(3, 5, 2), 6);
240 assert_eq!(graph.add_edge(4, 5, 3), 7);
241
242 assert_eq!(graph.flow(0, 5), 5);
243
244 let edges = graph.edges();
245 {
246 #[rustfmt::skip]
247 assert_eq!(
248 edges,
249 vec![
250 Edge { from: 0, to: 1, cap: 3, flow: 3 },
251 Edge { from: 0, to: 2, cap: 3, flow: 2 },
252 Edge { from: 1, to: 2, cap: 2, flow: 0 },
253 Edge { from: 1, to: 3, cap: 3, flow: 3 },
254 Edge { from: 2, to: 4, cap: 2, flow: 2 },
255 Edge { from: 3, to: 4, cap: 4, flow: 1 },
256 Edge { from: 3, to: 5, cap: 2, flow: 2 },
257 Edge { from: 4, to: 5, cap: 3, flow: 3 },
258 ]
259 );
260 }
261 assert_eq!(
262 graph.min_cut(0),
263 vec![true, false, true, false, false, false]
264 );
265 }
266
267 #[test]
268 fn test_max_flow_wikipedia_multiple_edges() {
269 let mut graph = MfGraph::new(6);
272 for &(u, v, c) in &[
273 (0, 1, 3),
274 (0, 2, 3),
275 (1, 2, 2),
276 (1, 3, 3),
277 (2, 4, 2),
278 (3, 4, 4),
279 (3, 5, 2),
280 (4, 5, 3),
281 ] {
282 for _ in 0..c {
283 graph.add_edge(u, v, 1);
284 }
285 }
286
287 assert_eq!(graph.flow(0, 5), 5);
288 assert_eq!(
289 graph.min_cut(0),
290 vec![true, false, true, false, false, false]
291 );
292 }
293
294 #[test]
295 #[allow(clippy::many_single_char_names)]
296 fn test_max_flow_misawa() {
297 let n = 100;
300
301 let mut graph = MfGraph::new((n + 1) * 2 + 5);
302 let (s, a, b, c, t) = (0, 1, 2, 3, 4);
303 graph.add_edge(s, a, 1);
304 graph.add_edge(s, b, 2);
305 graph.add_edge(b, a, 2);
306 graph.add_edge(c, t, 2);
307 for i in 0..n {
308 let i = 2 * i + 5;
309 for j in 0..2 {
310 for k in 2..4 {
311 graph.add_edge(i + j, i + k, 3);
312 }
313 }
314 }
315 for j in 0..2 {
316 graph.add_edge(a, 5 + j, 3);
317 graph.add_edge(2 * n + 5 + j, c, 3);
318 }
319
320 assert_eq!(graph.flow(s, t), 2);
321 }
322
323 #[test]
324 fn test_dont_repeat_same_phase() {
325 let n = 100_000;
326 let mut graph = MfGraph::new(3);
327 graph.add_edge(0, 1, n);
328 for _ in 0..n {
329 graph.add_edge(1, 2, 1);
330 }
331 assert_eq!(graph.flow(0, 2), n);
332 }
333}