122 lines
3.6 KiB
Rust
122 lines
3.6 KiB
Rust
use petgraph::algo::ford_fulkerson;
|
|
use petgraph::prelude::Graph;
|
|
|
|
#[test]
|
|
fn test_ford_fulkerson() {
|
|
// Example from https://downey.io/blog/max-flow-ford-fulkerson-algorithm-explanation/
|
|
let mut graph = Graph::<usize, u16>::new();
|
|
let source = graph.add_node(0);
|
|
let _ = graph.add_node(1);
|
|
let _ = graph.add_node(2);
|
|
let destination = graph.add_node(3);
|
|
graph.extend_with_edges(&[(0, 1, 3), (0, 2, 2), (1, 2, 5), (1, 3, 2), (2, 3, 3)]);
|
|
let (max_flow, _) = ford_fulkerson(&graph, source, destination);
|
|
assert_eq!(5, max_flow);
|
|
|
|
// Example from https://brilliant.org/wiki/ford-fulkerson-algorithm/
|
|
let mut graph = Graph::<usize, f32>::new();
|
|
let source = graph.add_node(0);
|
|
let _ = graph.add_node(1);
|
|
let _ = graph.add_node(2);
|
|
let _ = graph.add_node(3);
|
|
let _ = graph.add_node(4);
|
|
let destination = graph.add_node(5);
|
|
graph.extend_with_edges(&[
|
|
(0, 1, 4.),
|
|
(0, 2, 3.),
|
|
(1, 3, 4.),
|
|
(2, 4, 6.),
|
|
(3, 2, 3.),
|
|
(3, 5, 2.),
|
|
(4, 5, 6.),
|
|
]);
|
|
let (max_flow, _) = ford_fulkerson(&graph, source, destination);
|
|
assert_eq!(7.0, max_flow);
|
|
|
|
// Example from https://cp-algorithms.com/graph/edmonds_karp.html
|
|
let mut graph = Graph::<usize, f32>::new();
|
|
let source = graph.add_node(0);
|
|
let _ = graph.add_node(1);
|
|
let _ = graph.add_node(2);
|
|
let _ = graph.add_node(3);
|
|
let _ = graph.add_node(4);
|
|
let destination = graph.add_node(5);
|
|
graph.extend_with_edges(&[
|
|
(0, 1, 7.),
|
|
(0, 2, 4.),
|
|
(1, 3, 5.),
|
|
(1, 4, 3.),
|
|
(2, 1, 3.),
|
|
(2, 4, 2.),
|
|
(3, 5, 8.),
|
|
(4, 3, 3.),
|
|
(4, 5, 5.),
|
|
]);
|
|
let (max_flow, _) = ford_fulkerson(&graph, source, destination);
|
|
assert_eq!(10.0, max_flow);
|
|
|
|
// Example from https://www.programiz.com/dsa/ford-fulkerson-algorithm (corrected: result not 6 but 5)
|
|
let mut graph = Graph::<u8, f32>::new();
|
|
let source = graph.add_node(0);
|
|
let _ = graph.add_node(1);
|
|
let _ = graph.add_node(2);
|
|
let _ = graph.add_node(3);
|
|
let _ = graph.add_node(4);
|
|
let destination = graph.add_node(5);
|
|
graph.extend_with_edges(&[
|
|
(0, 1, 8.),
|
|
(0, 2, 3.),
|
|
(1, 3, 9.),
|
|
(2, 3, 7.),
|
|
(2, 4, 4.),
|
|
(3, 5, 2.),
|
|
(4, 5, 5.),
|
|
]);
|
|
let (max_flow, _) = ford_fulkerson(&graph, source, destination);
|
|
assert_eq!(5.0, max_flow);
|
|
|
|
let mut graph = Graph::<u8, u8>::new();
|
|
let source = graph.add_node(0);
|
|
let _ = graph.add_node(1);
|
|
let _ = graph.add_node(2);
|
|
let _ = graph.add_node(3);
|
|
let _ = graph.add_node(4);
|
|
let destination = graph.add_node(5);
|
|
graph.extend_with_edges(&[
|
|
(0, 1, 16),
|
|
(0, 2, 13),
|
|
(1, 2, 10),
|
|
(1, 3, 12),
|
|
(2, 1, 4),
|
|
(2, 4, 14),
|
|
(3, 2, 9),
|
|
(3, 5, 20),
|
|
(4, 3, 7),
|
|
(4, 5, 4),
|
|
]);
|
|
let (max_flow, _) = ford_fulkerson(&graph, source, destination);
|
|
assert_eq!(23, max_flow);
|
|
|
|
// Example taken from https://medium.com/@jithmisha/solving-the-maximum-flow-problem-with-ford-fulkerson-method-3fccc2883dc7
|
|
let mut graph = Graph::<u8, u8>::new();
|
|
let source = graph.add_node(0);
|
|
let _ = graph.add_node(1);
|
|
let _ = graph.add_node(2);
|
|
let _ = graph.add_node(3);
|
|
let _ = graph.add_node(4);
|
|
let destination = graph.add_node(5);
|
|
graph.extend_with_edges(&[
|
|
(0, 1, 10),
|
|
(0, 2, 10),
|
|
(1, 2, 2),
|
|
(1, 3, 4),
|
|
(1, 4, 8),
|
|
(2, 4, 9),
|
|
(3, 5, 10),
|
|
(4, 3, 6),
|
|
(4, 5, 10),
|
|
]);
|
|
let (max_flow, _) = ford_fulkerson(&graph, source, destination);
|
|
assert_eq!(19, max_flow);
|
|
}
|