use smallbitset::Set32;
pub fn all_mst(changeover: &Vec<Vec<usize>>) -> Vec<usize> {
let n_items = changeover.len() as u8;
let n_poss = 2_u32.pow(n_items as u32);
let mut ret = vec![];
for i in 0..n_poss {
let bs = Set32::from(i);
ret.push(mst(bs, changeover));
}
ret
}
pub fn mst(members: Set32, changeover: &[Vec<usize>]) -> usize {
if members.len() <= 1 {
0
} else {
let mut covered = Set32::empty();
let mut total = 0;
for a in members.iter() {
if covered.contains(a) {
continue;
}
let mut emin = usize::MAX;
let mut bmin = a;
for b in members.iter() {
if a == b {
continue;
}
let edge = changeover[a][b];
let edge = edge.min(changeover[b][a]);
if edge < emin {
emin = edge;
bmin = b;
}
}
total += emin;
covered = covered.add(a);
covered = covered.add(bmin);
}
total
}
}