并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询两种操作的一种数据结构
并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
并查集有两个基本操作:
- Find: 查找元素所属子集
- Union:合并两个子集为一个新的集合
可以使用树这种数据结构来表示集合,不同的树就是不同的集合,并查集中包含了多颗树,表示并查集中不同的子集,树的集合是森林,所有并查集属于森林。
基础操作
初始化:
//使用fa[i]用来存储每个元素的父节点,初始化时,每个元素的父节点为其自身。
int fa[MAXN];
void init(int n){
for(int i = 0; i < n; i++)
fa[i] = i;
}
查询:
//使用递归的算法实现对元素的逐层向上查询,一层层地往上访问父节点,直至根节点
int find(int x){
if(fa[x] == x)
return x;
else
return find(fa[x]);
}
合并:
//合并操作也很简单,先找到两个集合的代表元素,然后将前者的父节点设置为后者即可
void merge(int i,int j){
fa[find[i]] = find[j];
}