ac_library/
maxflow.rs

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    /// `s != t` must hold, otherwise it panics.
79    pub fn flow(&mut self, s: usize, t: usize) -> Cap {
80        self.flow_with_capacity(s, t, Cap::max_value())
81    }
82    /// # Parameters
83    /// * `s != t` must hold, otherwise it panics.
84    /// * `flow_limit >= 0`
85    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        // By the definition of max flow in appendix.html, this function should return 0
90        // when the same vertices are provided.  On the other hand, it is reasonable to
91        // return infinity-like value too, which is what the original implementation
92        // (and this implementation without the following assertion) does.
93        // Since either return value is confusing, we'd rather deny the parameters
94        // of the two same vertices.
95        // For more details, see https://github.com/rust-lang-ja/ac-library-rs/pull/24#discussion_r485343451
96        // and https://github.com/atcoder/ac-library/issues/5 .
97        assert_ne!(s, t);
98        // Additional constraint
99        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        // From https://commons.wikimedia.org/wiki/File:Min_cut.png
231        // Under CC BY-SA 3.0 https://creativecommons.org/licenses/by-sa/3.0/deed.en
232        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        // From https://commons.wikimedia.org/wiki/File:Min_cut.png
270        // Under CC BY-SA 3.0 https://creativecommons.org/licenses/by-sa/3.0/deed.en
271        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        // Originally by @MiSawa
298        // From https://gist.github.com/MiSawa/47b1d99c372daffb6891662db1a2b686
299        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}