use crate::Vec;
pub(super) struct DisjointSet {
parent: Vec<usize>,
rank: Vec<u8>,
}
impl DisjointSet {
pub(super) fn new(count: usize) -> Self {
Self {
parent: (0..count).collect(),
rank: vec![0; count],
}
}
fn find(&mut self, node: usize) -> usize {
if self.parent[node] != node {
self.parent[node] = self.find(self.parent[node]);
}
self.parent[node]
}
pub(super) fn union(&mut self, left: usize, right: usize) -> bool {
let mut left = self.find(left);
let mut right = self.find(right);
if left == right {
return false;
}
if self.rank[left] < self.rank[right] {
core::mem::swap(&mut left, &mut right);
}
self.parent[right] = left;
if self.rank[left] == self.rank[right] {
self.rank[left] += 1;
}
true
}
}