use std::collections::HashMap;
use std::hash::Hash;
use std::rc::Rc;
use crate::data_structures::tree::TreeNode;
pub struct Graph<T> {
pub graph: HashMap<Rc<TreeNode<T>>, Vec<(Rc<TreeNode<T>>, Option<i32>)>>,
}
impl<T: Eq + Hash + Clone> Graph<T> {
pub fn new() -> Self {
Graph {
graph: HashMap::new(),
}
}
pub fn add_node(&mut self, node: Rc<TreeNode<T>>) {
self.graph.entry(node).or_insert(Vec::new());
}
pub fn remove_node(&mut self, node: Rc<TreeNode<T>>) {
for (_, neighbors) in &mut self.graph {
neighbors.retain(|(neighbor, _)| neighbor != &node);
}
self.graph.retain(|k, _| k != &node);
}
pub fn add_edge(&mut self, a: Rc<TreeNode<T>>, b: Rc<TreeNode<T>>, weight: Option<i32>) {
self.graph
.entry(Rc::clone(&a))
.or_insert(Vec::new())
.push((Rc::clone(&b), weight));
self.graph
.entry(Rc::clone(&b))
.or_insert(Vec::new())
.push((Rc::clone(&a), weight));
}
pub fn remove_edge(&mut self, a: Rc<TreeNode<T>>, b: Rc<TreeNode<T>>) {
if let Some(neighbors) = self.graph.get_mut(&a) {
neighbors.retain(|(neighbor, _)| neighbor != &b);
}
if let Some(neighbors) = self.graph.get_mut(&b) {
neighbors.retain(|(neighbor, _)| neighbor != &a);
}
}
}