use std::collections::{HashMap, HashSet};
#[derive(Debug, Clone)]
pub struct Graph {
edges: Vec<(usize, usize)>,
}
impl Graph {
pub fn new(edges: Vec<(usize, usize)>) -> Self {
Self { edges }
}
}
pub fn solve(graph: &Graph) -> HashSet<usize> {
let mut vertex_cover = HashSet::new();
let mut remaining_edges: HashSet<_> = graph.edges.iter().cloned().collect();
let mut adj_list: HashMap<usize, Vec<usize>> = HashMap::new();
for &(u, v) in &graph.edges {
adj_list.entry(u).or_default().push(v);
adj_list.entry(v).or_default().push(u);
}
while let Some(&(u, v)) = remaining_edges.iter().next() {
vertex_cover.insert(u);
vertex_cover.insert(v);
let edges_to_remove: Vec<_> = remaining_edges
.iter()
.filter(|&&(x, y)| x == u || x == v || y == u || y == v)
.cloned()
.collect();
for edge in edges_to_remove {
remaining_edges.remove(&edge);
}
}
vertex_cover
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_simple_graph() {
let edges = vec![(0, 1), (1, 2)];
let graph = Graph::new(edges);
let cover = solve(&graph);
assert!(cover.len() <= 2);
for &(u, v) in &graph.edges {
assert!(cover.contains(&u) || cover.contains(&v));
}
}
#[test]
fn test_star_graph() {
let edges = vec![(0, 1), (0, 2), (0, 3), (0, 4)];
let graph = Graph::new(edges);
let cover = solve(&graph);
assert!(cover.len() <= 2);
for &(u, v) in &graph.edges {
assert!(cover.contains(&u) || cover.contains(&v));
}
}
}