c9d46eb224
This expands the API to be more flexible, allowing for more visitation patterns on graphs. This will be useful to avoid extra datasets (and allocations) in cases where the expanded DFS API is sufficient. This also fixes a bug with the previous DFS constructor, which left the start node not marked as visited (even though it was immediately returned).
39 lines
1.0 KiB
Rust
39 lines
1.0 KiB
Rust
use super::super::tests::TestGraph;
|
|
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn diamond_post_order() {
|
|
let graph = TestGraph::new(0, &[(0, 1), (0, 2), (1, 3), (2, 3)]);
|
|
|
|
let result = post_order_from(&graph, 0);
|
|
assert_eq!(result, vec![3, 1, 2, 0]);
|
|
}
|
|
|
|
#[test]
|
|
fn is_cyclic() {
|
|
use super::super::is_cyclic;
|
|
|
|
let diamond_acyclic = TestGraph::new(0, &[(0, 1), (0, 2), (1, 3), (2, 3)]);
|
|
let diamond_cyclic = TestGraph::new(0, &[(0, 1), (1, 2), (2, 3), (3, 0)]);
|
|
|
|
assert!(!is_cyclic(&diamond_acyclic));
|
|
assert!(is_cyclic(&diamond_cyclic));
|
|
}
|
|
|
|
#[test]
|
|
fn dfs() {
|
|
let graph = TestGraph::new(0, &[(0, 1), (0, 2), (1, 3), (2, 3), (3, 0)]);
|
|
|
|
let result: Vec<usize> = DepthFirstSearch::new(&graph).with_start_node(0).collect();
|
|
assert_eq!(result, vec![0, 2, 3, 1]);
|
|
}
|
|
|
|
#[test]
|
|
fn dfs_debug() {
|
|
let graph = TestGraph::new(0, &[(0, 1), (0, 2), (1, 3), (2, 3), (3, 0)]);
|
|
let mut dfs = DepthFirstSearch::new(&graph).with_start_node(0);
|
|
dfs.complete_search();
|
|
assert_eq!(format!("{{0, 1, 2, 3}}"), format!("{:?}", dfs));
|
|
}
|