Skip to content

Minimum Spanning Tree Examples

Find the subset of edges that connects the graph with minimal total weight.

Prim's Algorithm

Use Prim's for dense graphs or when you want to grow a tree from a specific node.

use graphina::core::types::Graph;
use graphina::mst::prim_mst;
use ordered_float::OrderedFloat;

fn main() {
    // Note: Weights must be Ord (OrderedFloat for f64)
    let mut graph = Graph::<&str, OrderedFloat<f64>>::new();

    let n1 = graph.add_node("A");
    let n2 = graph.add_node("B");
    let n3 = graph.add_node("C");

    graph.add_edge(n1, n2, OrderedFloat(1.0));
    graph.add_edge(n2, n3, OrderedFloat(2.0));
    graph.add_edge(n1, n3, OrderedFloat(10.0));

    // Returns (Vec<(u, v, w)>, total_weight)
    if let Ok((edges, total)) = prim_mst(&graph) {
        println!("MST Total Weight: {}", total);
        for (u, v, w) in edges {
            println!("Edge: {:?} - {:?} (wt: {})", u, v, w);
        }
    }
}

Kruskal's Algorithm

Kruskal's is efficient for sparse graphs and works by sorting edges.

use graphina::core::types::Graph;
use graphina::mst::kruskal_mst;
use ordered_float::OrderedFloat;

fn main() {
    let mut graph = Graph::<&str, OrderedFloat<f64>>::new();
    let n1 = graph.add_node("A");
    let n2 = graph.add_node("B");
    graph.add_edge(n1, n2, OrderedFloat(1.0));

    if let Ok((edges, total)) = kruskal_mst(&graph) {
        println!("Kruskal MST Weight: {}", total);
    }
}