| Crates.io | gomory-hu-tree |
| lib.rs | gomory-hu-tree |
| version | 1.0.0 |
| created_at | 2025-06-18 13:33:54.589153+00 |
| updated_at | 2025-06-18 13:33:54.589153+00 |
| description | A Rust implementation of the Gomory-Hu tree algorithm for finding all-pairs min-cuts in a graph. |
| homepage | https://github.com/username/gomory-hu-tree |
| repository | https://github.com/username/gomory-hu-tree |
| max_upload_size | |
| id | 1717149 |
| size | 100,042 |
A Rust implementation of Gomory-Hu Cut Tree Construction, providing efficient all-pairs minimum cut queries. After an initial preprocessing step to build the tree (typically O(N * MaxFlowTime)), the minimum cut value between any pair of nodes can be queried efficiently (currently O(N) in this implementation, with potential for O(log N)).
AdjacencyListFlowGraph)
suitable for flow algorithms, using petgraph internally.GomoryHuTree::min_cut_value).GomoryHuTree::to_dot).cargo bench.Add to Cargo.toml:
[dependencies]
gomory_hu_tree = "1.0.0"
Basic Usage:
use gomory_hu_tree::{gusfield_tree, DinicSolver, AdjacencyListFlowGraph, GomoryHuError};
fn main() -> Result<(), GomoryHuError> {
// 1. Create a graph (e.g., a line graph 0-1-2)
let mut graph = AdjacencyListFlowGraph::new();
let n0 = graph.add_node(()); // node 0
let n1 = graph.add_node(()); // node 1
let n2 = graph.add_node(()); // node 2
// Add undirected edges (as pairs of directed edges with same capacity)
graph.add_edge(n0, n1, 10.0); graph.add_edge(n1, n0, 10.0); // 0-1 with capacity 10
graph.add_edge(n1, n2, 5.0); graph.add_edge(n2, n1, 5.0); // 1-2 with capacity 5
// 2. Initialize a MaxFlowSolver
let solver = DinicSolver::new();
// 3. Build Gomory-Hu tree
let gh_tree = gusfield_tree(&graph, &solver)?;
// 4. Query minimum cut values
// For the line graph 0 --10-- 1 --5-- 2:
// Min-cut(0,1) = 10.0
// Min-cut(1,2) = 5.0
// Min-cut(0,2) = 5.0 (bottleneck on path 0-1-2 in the GH tree)
println!("Min-cut between node {} and {}: {}", n0, n1, gh_tree.min_cut_value(n0,n1));
println!("Min-cut between node {} and {}: {}", n1, n2, gh_tree.min_cut_value(n1,n2));
println!("Min-cut between node {} and {}: {}", n0, n2, gh_tree.min_cut_value(n0,n2));
// Example: For the line graph, the tree structure would be:
// 0 --10.0-- 1
// 1 --5.0--- 2
// min_cut_value(0,2) traverses 0-1 (10.0) and 1-2 (5.0), bottleneck is 5.0.
// To visualize the tree (e.g., print in DOT format):
// println!("\nGraphviz DOT format of the Gomory-Hu tree:\n{}", gh_tree.to_dot());
Ok(())
}
The Gomory-Hu Cut Tree (R. E. Gomory and T. C. Hu, 1961) is a data structure
that represents the minimum s-t cuts for all N(N-1)/2 vertex pairs in an undirected graph.
It is a weighted tree where edges correspond to min-cuts in the original graph.
The min-cut value between any two nodes s and t in the original graph is equal to
the minimum capacity of any edge on the unique path between s and t in the Gomory-Hu tree.
This implementation uses Gusfield's simplified algorithm (D. Gusfield, 1990), which requires N-1 max-flow computations, avoiding graph contractions used in the original Gomory-Hu method.
GomoryHuTree::min_cut_value is currently O(N) (where N is number of vertices in original graph)
due to a Breadth-First Search (BFS) on the tree edges to find the path and its bottleneck capacity.
Future optimizations could use Lowest Common Ancestor (LCA) algorithms for O(log N) or O(alpha(N)) queries
if a more advanced tree data structure is used internally.MaxFlowError (from the solver) and GomoryHuError (from tree construction).AdjacencyListFlowGraph is a directed graph.
To model undirected edges for Gomory-Hu construction (which operates on undirected graphs),
users should add pairs of directed edges (i.e., u->v and v->u both with the same capacity).petgraph: The AdjacencyListFlowGraph uses petgraph::Graph internally for graph storage.Performance benchmarks for tree construction and min-cut queries are included in the crate. You can run them using:
cargo bench
The results will be available in the target/criterion directory.
Current observations indicate that tree construction is the most computationally intensive part,
as expected, due to the N-1 max-flow computations. Query performance is linear with the number of nodes.
Gomory-Hu trees are useful in various domains:
no_std environments (currently std is a default feature).The crate includes:
proptest to verify key properties of the Gomory-Hu tree (e.g., cut equivalence, tree structure) over a wide range of randomly generated graphs.Contributions are welcome! Please feel free to submit issues, bug reports, or pull requests. For major changes, please open an issue first to discuss the proposed changes.
This project is licensed under the MIT license.