use std::collections::{HashMap, VecDeque};
pub fn is_bipartite<T>(graph: &HashMap<T, Vec<T>>) -> bool
where
T: Eq + std::hash::Hash + Clone,
{
let mut color = HashMap::new();
for node in graph.keys() {
if !color.contains_key(node) {
let mut queue = VecDeque::new();
queue.push_back((node.clone(), true));
while let Some((n, c)) = queue.pop_front() {
if let Some(&col) = color.get(&n) {
if col != c {
return false;
}
} else {
color.insert(n.clone(), c);
if let Some(neighbors) = graph.get(&n) {
for neighbor in neighbors {
queue.push_back((neighbor.clone(), !c));
}
}
}
}
}
}
true
}