#[derive(Debug, Default)]
pub(super) struct UnionFind {
parent: Vec<usize>,
}
impl UnionFind {
pub(super) fn add(&mut self) -> usize {
self.parent.push(self.parent.len());
self.parent.len() - 1
}
pub(super) fn find(&mut self, node: usize) -> usize {
let mut root = node;
while self.parent[root] != root {
root = self.parent[root];
}
let mut current = node;
while self.parent[current] != root {
current = std::mem::replace(&mut self.parent[current], root);
}
root
}
pub(super) fn union(&mut self, a: usize, b: usize) {
let (ra, rb) = (self.find(a), self.find(b));
if ra != rb {
self.parent[ra.max(rb)] = ra.min(rb);
}
}
}