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