Skip to content

Commit 7365855

Browse files
Add tests
1 parent c05ac18 commit 7365855

File tree

1 file changed

+101
-1
lines changed

1 file changed

+101
-1
lines changed

src/maxflow.rs

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ where
3434
}
3535
}
3636

37-
pub struct Edge<Cap> {
37+
#[derive(Debug, PartialEq, Eq)]
38+
pub struct Edge<Cap: Integral> {
3839
pub from: usize,
3940
pub to: usize,
4041
pub cap: Cap,
@@ -222,3 +223,102 @@ struct _Edge<Cap> {
222223
rev: usize,
223224
cap: Cap,
224225
}
226+
227+
#[cfg(test)]
228+
mod test {
229+
use crate::{Edge, MfGraph};
230+
231+
#[test]
232+
fn test_max_flow_wikipedia() {
233+
// From https://commons.wikimedia.org/wiki/File:Min_cut.png
234+
// Under CC BY-SA 3.0 https://creativecommons.org/licenses/by-sa/3.0/deed.en
235+
let mut graph = MfGraph::new(6);
236+
assert_eq!(graph.add_edge(0, 1, 3), 0);
237+
assert_eq!(graph.add_edge(0, 2, 3), 1);
238+
assert_eq!(graph.add_edge(1, 2, 2), 2);
239+
assert_eq!(graph.add_edge(1, 3, 3), 3);
240+
assert_eq!(graph.add_edge(2, 4, 2), 4);
241+
assert_eq!(graph.add_edge(3, 4, 4), 5);
242+
assert_eq!(graph.add_edge(3, 5, 2), 6);
243+
assert_eq!(graph.add_edge(4, 5, 3), 7);
244+
245+
assert_eq!(graph.flow(0, 5), 5);
246+
247+
let edges = graph.edges();
248+
{
249+
#[rustfmt::skip]
250+
assert_eq!(
251+
edges,
252+
vec![
253+
Edge { from: 0, to: 1, cap: 3, flow: 3 },
254+
Edge { from: 0, to: 2, cap: 3, flow: 2 },
255+
Edge { from: 1, to: 2, cap: 2, flow: 0 },
256+
Edge { from: 1, to: 3, cap: 3, flow: 3 },
257+
Edge { from: 2, to: 4, cap: 2, flow: 2 },
258+
Edge { from: 3, to: 4, cap: 4, flow: 1 },
259+
Edge { from: 3, to: 5, cap: 2, flow: 2 },
260+
Edge { from: 4, to: 5, cap: 3, flow: 3 },
261+
]
262+
);
263+
}
264+
assert_eq!(
265+
graph.min_cut(0),
266+
vec![true, false, true, false, false, false]
267+
);
268+
}
269+
270+
#[test]
271+
fn test_max_flow_wikipedia_multiple_edges() {
272+
// From https://commons.wikimedia.org/wiki/File:Min_cut.png
273+
// Under CC BY-SA 3.0 https://creativecommons.org/licenses/by-sa/3.0/deed.en
274+
let mut graph = MfGraph::new(6);
275+
for &(u, v, c) in &[
276+
(0, 1, 3),
277+
(0, 2, 3),
278+
(1, 2, 2),
279+
(1, 3, 3),
280+
(2, 4, 2),
281+
(3, 4, 4),
282+
(3, 5, 2),
283+
(4, 5, 3),
284+
] {
285+
for _ in 0..c {
286+
graph.add_edge(u, v, 1);
287+
}
288+
}
289+
290+
assert_eq!(graph.flow(0, 5), 5);
291+
assert_eq!(
292+
graph.min_cut(0),
293+
vec![true, false, true, false, false, false]
294+
);
295+
}
296+
297+
#[test]
298+
fn test_max_flow_misawa() {
299+
// Originally by @MiSawa
300+
// From https://gist.github.com/MiSawa/47b1d99c372daffb6891662db1a2b686
301+
let n = 100;
302+
303+
let mut graph = MfGraph::new((n + 1) * 2 + 5);
304+
let (s, a, b, c, t) = (0, 1, 2, 3, 4);
305+
graph.add_edge(s, a, 1);
306+
graph.add_edge(s, b, 2);
307+
graph.add_edge(b, a, 2);
308+
graph.add_edge(c, t, 2);
309+
for i in 0..n {
310+
let i = 2 * i + 5;
311+
for j in 0..2 {
312+
for k in 2..4 {
313+
graph.add_edge(i + j, i + k, 3);
314+
}
315+
}
316+
}
317+
for j in 0..2 {
318+
graph.add_edge(a, 5 + j, 3);
319+
graph.add_edge(2 * n + 5 + j, c, 3);
320+
}
321+
322+
assert_eq!(graph.flow(s, t), 2);
323+
}
324+
}

0 commit comments

Comments
 (0)