use std::collections::{BinaryHeap, HashMap, HashSet};
use std::cmp::Reverse;
use std::hash::Hash;
pub fn prim<T, W>(_nodes: &[T], edges: &[(T, T, W)], start: T) -> Vec<(T, T, W)>
where
T: Eq + Hash + Clone + Ord,
W: Copy + Ord + Default,
{
let mut adj: HashMap<T, Vec<(T, W)>> = HashMap::new();
for (u, v, w) in edges {
adj.entry(u.clone()).or_default().push((v.clone(), *w));
adj.entry(v.clone()).or_default().push((u.clone(), *w));
}
let mut visited = HashSet::new();
let mut heap = BinaryHeap::new();
let mut mst = Vec::new();
visited.insert(start.clone());
for (v, w) in adj.get(&start).unwrap_or(&vec![]) {
heap.push(Reverse((*w, start.clone(), v.clone())));
}
while let Some(Reverse((w, u, v))) = heap.pop() {
if visited.contains(&v) {
continue;
}
visited.insert(v.clone());
mst.push((u.clone(), v.clone(), w));
for (to, weight) in adj.get(&v).unwrap_or(&vec![]) {
if !visited.contains(to) {
heap.push(Reverse((*weight, v.clone(), to.clone())));
}
}
}
mst
}