并查集支持两个操作:1.合并,即合并两个集合;2.查找,即能判断两个元素是否在一个集合内
并查集基本操作:
1.初始化
for(int i = 0; i < n; i++){
father[i] = i; //在并查集使用前,先让其为自身。因为一开始每个元素都是独立的一个集合
}
2.查找
查找可以用递推或递归实现,主要代码如下:
//递推实现
int findFather(int x){
int a = x;
//若不要求路径压缩,则只写该循环够了
while(x != father[x]){
x = father[x];
}
//若要求路径压缩,则还需加下面这个循环
while(a != father[a]){
int z = a;
a = father[a];
father[z] = x; //此时的x是根
}
return x;
}
//递归实现
int findFather(int x){
if(x == father[x]) return x;
else{
return findFather(father[x]);
}
}
3.合并
合并是指两个集合 合并 成一个集合。
void Union(int a, int b){
int faA = findFather(a);
int faB = findFather(b);
if(faA != faB){ //若a和b不属于同一个集合
father[faA] = faB;
}
}
有关并查集的例题:
PAT A1107