use crate::dag_sampling::graph::Graph;
pub(crate) fn mcs(g: &Graph) -> Vec<usize> {
let mut ordering = Vec::new();
let mut sets: Vec<Vec<usize>> = vec![Vec::new(); g.n];
let mut cardinality = vec![0usize; g.n];
let mut max_cardinality = 0usize;
sets[0] = (0..g.n).collect();
let mut idx = 0;
while idx < g.n {
while max_cardinality > 0 && sets[max_cardinality].is_empty() {
max_cardinality -= 1;
}
let u = sets[max_cardinality].pop().unwrap();
if cardinality[u] == usize::MAX {
continue;
}
idx += 1;
ordering.push(u);
cardinality[u] = usize::MAX;
for &v in g.neighbors(u) {
if cardinality[v] < g.n {
cardinality[v] += 1;
sets[cardinality[v]].push(v);
}
}
max_cardinality += 1;
}
ordering
}