use std::collections::{HashMap, VecDeque};
pub fn topological_sort<T>(graph: &HashMap<T, Vec<T>>) -> Option<Vec<T>>
where
T: Eq + std::hash::Hash + Clone,
{
let mut in_degree = HashMap::new();
for node in graph.keys() {
in_degree.entry(node.clone()).or_insert(0);
}
for neighbors in graph.values() {
for neighbor in neighbors {
*in_degree.entry(neighbor.clone()).or_insert(0) += 1;
}
}
let mut queue = VecDeque::new();
for (node, °) in &in_degree {
if deg == 0 {
queue.push_back(node.clone());
}
}
let mut order = Vec::new();
while let Some(node) = queue.pop_front() {
order.push(node.clone());
if let Some(neighbors) = graph.get(&node) {
for neighbor in neighbors {
let deg = in_degree.get_mut(neighbor).unwrap();
*deg -= 1;
if *deg == 0 {
queue.push_back(neighbor.clone());
}
}
}
}
if order.len() == in_degree.len() {
Some(order)
} else {
None
}
}