并查集是图论中计算「动态连通性」的一种数据结构, 可用于计算图的连通性相关问题.
并查集支持两种基本操作:
- 合并(Union):合并两个元素所属集合(合并对应的树)
- 查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于判断两个元素是否属于同一集合
在实现中,并查集可用一个数组来实现。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| /// 并查集
struct UnionFindSet {
n: usize,
pa: Vec<usize>,
}
impl UnionFindSet {
// 新建并查集
pub fn new(n: usize) -> Self {
UnionFindSet {
n,
pa: (0..n).collect::<Vec<_>>(),
}
}
// 并查集大小
pub fn size(&self) -> usize {
self.n
}
// 查找节点所在的集
pub fn find(&mut self, a: usize) -> usize {
let mut a_ = a;
while self.pa[a_] != a_ {
a_ = self.pa[a_];
}
self.pa[a] = a_;
a_
}
// 判断两个节点是否在一个并查集中
pub fn is_connected(&mut self, a: usize, b: usize) -> bool {
self.find(a) == self.find(b)
}
// 合并两个节点到一个并查集中
pub fn union(&mut self, a: usize, b: usize) {
let a_ = self.find(a);
let b_ = self.find(b);
if a_ != b_ {
self.pa[a_] = b_;
self.n -= 1;
}
}
}
|
- https://oi-wiki.org/ds/dsu/
- https://labuladong.github.io/algo/di-yi-zhan-da78c/shou-ba-sh-03a72/bing-cha-j-323f3/
- https://cloud.tencent.com/developer/article/1818370