use std::collections::{HashMap, HashSet};
pub fn has_cycle<T>(graph: &HashMap<T, Vec<T>>) -> bool
where
T: Eq + std::hash::Hash + Clone,
{
fn visit<T: Eq + std::hash::Hash + Clone>(
node: &T,
graph: &HashMap<T, Vec<T>>,
visited: &mut HashSet<T>,
stack: &mut HashSet<T>,
) -> bool {
if !visited.insert(node.clone()) {
return stack.contains(node);
}
stack.insert(node.clone());
if let Some(neighbors) = graph.get(node) {
for neighbor in neighbors {
if visit(neighbor, graph, visited, stack) {
return true;
}
}
}
stack.remove(node);
false
}
let mut visited = HashSet::new();
let mut stack = HashSet::new();
for node in graph.keys() {
if !visited.contains(node) && visit(node, graph, &mut visited, &mut stack) {
return true;
}
}
false
}