| Crates.io | strongly-connected-components |
| lib.rs | strongly-connected-components |
| version | 1.0.0 |
| created_at | 2026-01-02 19:55:08.116819+00 |
| updated_at | 2026-01-02 23:08:14.647408+00 |
| description | Decomposes a graph into Strongly Connected Components and to sorts them in topological order. |
| homepage | |
| repository | https://github.com/mareksom/strongly-connected-components |
| max_upload_size | |
| id | 2019128 |
| size | 42,694 |
Decomposes a graph into Strongly Connected Components and sorts them in topological order.
Add this to your Cargo.toml:
[dependencies]
strongly-connected-components = "0.1"
// ┌───┐ ┌───┐ ┌───┐
// │ 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);
let decomp: SccDecomposition = graph.find_sccs();
// There are 2 SCCs in the example graph: `[a]` and `[b, c]`.
assert_eq!(decomp.len(), 2);
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);
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]);
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]);
| Type | Description |
|---|---|
Graph |
The graph structure. Create nodes with new_node() and edges with new_edge(). |
Node |
A node in the graph. |
Scc |
A single strongly connected component. Iterate over nodes with iter_nodes(). |
SccDecomposition |
The result of running graph.find_sccs(). Query SCCs and iterate in topological order. |
This project is licensed under the MIT License - see the LICENSE file for details.