Expand description
Decomposes a graph into Strongly Connected Components and to sorts them in topological order.
§Usage
- Define the
Graphstructure:
// ┌───┐ ┌───┐ ┌───┐
// │ a ├─►│ b ├─►│ c │
// └───┘ └─▲─┘ └─┬─┘
// └──────┘
let mut graph = Graph::new();
let a: Node = graph.new_node();
let b: Node = graph.new_node();
let c: Node = graph.new_node();
graph.new_edge(a, b);
graph.new_edge(b, c);
graph.new_edge(c, b);- Run the algorithm and create the
SccDecomposition:
let decomp: SccDecomposition = graph.find_sccs();
// There are 2 SCCs in the example graph: `[a]` and `[b, c]`.
assert_eq!(decomp.len(), 2);- Check whether two nodes belong to the same
Scc:
let a_scc: &Scc = decomp.scc_of_node(a);
let b_scc: &Scc = decomp.scc_of_node(b);
let c_scc: &Scc = decomp.scc_of_node(c);
// Node `a` belongs to a different SCC than `b` and `c`.
assert_ne!(a_scc, b_scc);
assert_ne!(a_scc, c_scc);
// Nodes `b` and `c` belong to the same SCC.
assert_eq!(b_scc, c_scc);- List all nodes belonging to
Scc:
assert_eq!(a_scc.len(), 1);
let a_scc_all: Vec<Node> = a_scc.iter_nodes().collect();
assert_eq!(a_scc_all, vec![a]);
assert_eq!(b_scc.len(), 2);
let b_scc_all: Vec<Node> = b_scc.iter_nodes().collect();
assert_eq!(b_scc_all, vec![b, c]);- List
Sccs in topological order:
let sccs: Vec<&Scc> = decomp.iter_sccs().collect();
assert_eq!(sccs, vec![b_scc, a_scc]);let nodes: Vec<Node> = decomp.iter_nodes().collect();
// Either of those would be a valid order,
// because `b` and `c` belong to the same SCC.
assert!(nodes == vec![c, b, a] || nodes == vec![b, c, a]);Structs§
- Graph
- Represents the graph on which SCC decomposition will be done.
Consists of
Nodes, connected by directed edges. - Node
- Represents a single node of the graph.
A node can be created by calling
Graph::new_node(). - Scc
- Represents a single
Strongly Connected Component
(SCC) of a
Graph. - SccDecomposition
- Represents the decomposition of a
Graphinto Strongly Connected Components (SCC).