diff --git a/vertex_cover/src/main.rs b/vertex_cover/src/main.rs index fc75d3c..42b2e7f 100644 --- a/vertex_cover/src/main.rs +++ b/vertex_cover/src/main.rs @@ -155,8 +155,11 @@ enum Method { #[derive(Debug, Parser)] struct Args { filename: PathBuf, + #[clap(default_value = "reduction2")] method: Method, k: Option, + #[clap(short, long)] + reverse: bool, } fn main() { @@ -169,6 +172,20 @@ fn main() { let r = vertex_cover(&graph, k, args.method); eprintln!("{}: {:?}", k, start.elapsed()); r + } else if args.reverse { + let mut k = graph.num_vertices(); + let mut last_solution = None; + loop { + let start = std::time::Instant::now(); + let r = vertex_cover(&graph, k, args.method); + eprintln!("{}: {:?}", k, start.elapsed()); + if let Some(r) = r { + k = r.len() as u16 - 1; + last_solution = Some(r); + } else { + break last_solution; + }; + } } else { let mut k = 0; loop { diff --git a/vertex_cover/src/owned.rs b/vertex_cover/src/owned.rs index 1171e0c..3dc3d31 100644 --- a/vertex_cover/src/owned.rs +++ b/vertex_cover/src/owned.rs @@ -237,6 +237,8 @@ pub fn reduction2(graph: &mut Graph, k: u16) -> Option> { let _ = graph.reinsert_vertices(1); r + } else if graph.is_empty() { + Some(Vec::new()) } else if k == 0 { if graph.is_empty() { Some(Vec::new()) @@ -343,6 +345,10 @@ pub fn reduction2(graph: &mut Graph, k: u16) -> Option> { } } } else if let Some(vertex) = graph.get_vertex_with_degree_greater(3) { + if k < 1 { + return None; + } + graph.remove_vertex(vertex); match reduction2(graph, k - 1) { @@ -374,6 +380,6 @@ pub fn reduction2(graph: &mut Graph, k: u16) -> Option> { } } } else { - unreachable!() + unreachable!("{k}") } }