diff options
Diffstat (limited to 'graph-checker/src/compute.rs')
| -rw-r--r-- | graph-checker/src/compute.rs | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/graph-checker/src/compute.rs b/graph-checker/src/compute.rs index e166e14..0beaad9 100644 --- a/graph-checker/src/compute.rs +++ b/graph-checker/src/compute.rs @@ -7,17 +7,23 @@ pub async fn dominating_numbers( let mut independent_dominating = None; let mut geodesic_sets = Vec::new(); - let mut min_size = g.size as u32; + let mut min_size = g.size; for cs in g.cutsets() { - let dom = cs.is_dominating_in(&g); - let idp = cs.graph.is_independent(); - if independent_dominating.is_none() && dom && idp { - independent_dominating = Some(cs.cardinality as u32); + if independent_dominating.is_none() { + let dom = cs.is_dominating_in(&g); + let idp = cs.graph.is_independent(); + if dom && idp { + independent_dominating = Some(cs.cardinality as u32); + } + } + + if cs.cardinality > min_size { + continue; } let mut visited = vec![0; g.size]; - for a in 0..cs.graph.size { + 'outer: for a in 0..cs.graph.size { if cs.vertices[a] == 0 { continue; } @@ -32,20 +38,22 @@ pub async fn dominating_numbers( } } } + if visited.iter().sum::<usize>() == g.size { + break 'outer; + } } } if visited.iter().sum::<usize>() == g.size { geodesic_sets.push(cs.vertices.clone()); - let tmp = cs.vertices.into_iter().sum::<u32>(); - if tmp < min_size { - min_size = tmp; + if cs.cardinality < min_size { + min_size = cs.cardinality; } } } let geodesic_sets: Vec<_> = geodesic_sets .into_iter() - .filter(|s| s.iter().sum::<u32>() == min_size) + .filter(|s| s.iter().sum::<u32>() == min_size as u32) .collect(); let mut fg = None; @@ -72,10 +80,13 @@ pub async fn dominating_numbers( fg = Some(new_fg); } } + if let Some(fg) = fg { + if fg == 1 { + break; + } + } } } - // println!("{line} {independent_dominating:?} {fg:?}"); - (line, independent_dominating, fg) } |