use std::collections::{HashMap, HashSet, VecDeque};
pub fn connected_components<T>(graph: &HashMap<T, Vec<T>>) -> Vec<Vec<T>>
where
T: Eq + std::hash::Hash + Clone,
{
let mut visited = HashSet::new();
let mut components = Vec::new();
for node in graph.keys() {
if !visited.contains(node) {
let mut queue = VecDeque::new();
let mut comp = Vec::new();
queue.push_back(node.clone());
visited.insert(node.clone());
while let Some(n) = queue.pop_front() {
comp.push(n.clone());
if let Some(neighbors) = graph.get(&n) {
for neighbor in neighbors {
if visited.insert(neighbor.clone()) {
queue.push_back(neighbor.clone());
}
}
}
}
components.push(comp);
}
}
components
}