#[derive(Debug, Clone)]
pub(crate) struct UnionFind {
parents: Vec<usize>,
}
impl UnionFind {
pub(crate) fn new(length: usize) -> Self {
Self {
parents: (0..length).collect(),
}
}
pub(crate) fn len(&self) -> usize {
self.parents.len()
}
pub(crate) fn push(&mut self) -> usize {
let index = self.parents.len();
self.parents.push(index);
index
}
pub(crate) fn find(&mut self, node: usize) -> usize {
let parent = self.parents[node];
if parent != node {
self.parents[node] = self.find(parent);
}
self.parents[node]
}
pub(crate) fn root(&self, mut node: usize) -> usize {
while self.parents[node] != node {
node = self.parents[node];
}
node
}
pub(crate) fn union(&mut self, left: usize, right: usize) {
let left = self.find(left);
let right = self.find(right);
if left != right {
self.parents[right] = left;
}
}
}