Skip to content

Instantly share code, notes, and snippets.

@ashiato45
Created February 20, 2021 10:38
Show Gist options
  • Save ashiato45/22b4a0f024a6fe0796fcc34c85b9d69b to your computer and use it in GitHub Desktop.
Save ashiato45/22b4a0f024a6fe0796fcc34c85b9d69b to your computer and use it in GitHub Desktop.
mod union_find{
pub struct UnionFind{
pub parent: Vec<usize>,
rank: Vec<usize>,
islands: i64
}
impl UnionFind{
pub fn new(n: usize) -> UnionFind{
return UnionFind{parent: (0..n).collect(),
rank: vec![0; n],
islands: n as i64};
}
pub fn find(&mut self, a: usize) -> usize{
if self.parent[a] == a{
return a;
}else{
self.parent[a] = self.find(self.parent[a]);
return self.parent[a];
}
}
// あらたにつながったならtrue
pub fn unite(&mut self, a: usize, b: usize) -> bool{
assert!(a < self.parent.len());
assert!(b < self.parent.len());
let a = self.find(a);
let b = self.find(b);
if a == b{
return false;
}
if self.rank[a] < self.rank[b]{
self.parent[a] = b;
}else{
self.parent[b] = a;
if self.rank[a] == self.rank[b]{
self.rank[a] += 1;
}
}
return true;
}
pub fn same(&mut self, a: usize, b: usize) -> bool{
return self.find(a) == self.find(b)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment