use std::collections::HashMap;
use crate::Edge;
use crate::Vertex;
#[derive(Clone, Debug)]
pub struct Matching {
edges: HashMap<Vertex, Vertex>,
}
impl Matching {
pub fn new(edges: &[Edge]) -> Matching {
let mut map = HashMap::new();
for &(v, w) in edges {
map.insert(v, w);
map.insert(w, v);
}
Matching { edges: map }
}
pub fn is_empty(&self) -> bool {
self.edges.is_empty()
}
pub fn len(&self) -> usize {
self.edges.len() / 2
}
pub fn edges(&self) -> Vec<Edge> {
self.edges
.iter()
.filter(|&(&v, &w)| v < w)
.map(|(&v, &w)| (v, w))
.collect()
}
pub fn vertices(&self) -> Vec<Vertex> {
self.edges.keys().cloned().collect()
}
pub fn partner(&self, vertex: Vertex) -> Vertex {
self.edges[&vertex]
}
pub fn contract(&self, leafs: &[Vertex]) -> Matching {
let mut edges = self.edges.clone();
for leaf in leafs {
edges.remove(leaf);
}
Matching { edges }
}
pub fn augment(&self, path: &[Vertex]) -> Matching {
let mut edges = self.edges.clone();
for leaf in path {
edges.remove(leaf);
}
for (i, j) in (0..path.len() / 2).map(|i| (2 * i, 2 * i + 1)) {
edges.insert(path[i], path[j]);
edges.insert(path[j], path[i]);
}
Matching { edges }
}
pub fn add(&self, other: &Matching) -> Matching {
let mut edges = self.edges.clone();
for (&v, &w) in &other.edges {
edges.insert(v, w);
}
Matching { edges }
}
}