问题
判断两个元素是不是属于同一个集合,只需要查找他们的根元素,如果根元素相同则为同一个集合,否则为不同的集合。如果是不同的集合可以进行合并操作。为了提高查找效率,还可以采用路径压缩的方法。
初始化
int N;
const int maxn = 1010;
int father[maxn];
//并查集的初始化
void initUFS(){
for(int i=1;i<=N;++i)
father[i] = i;
}
查找
//查找
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;
}
return x;
}
合并
//合并
void Union(int a,int b){
int findA = findFather(a);
int findB = findFather(b);
if(findA != findB){
father[findA] = findB;
}
}