并查集的通俗解释就是用于把所有有关系的东西都并在一起,并且他们有个共同祖先。
第一步初始化:先各自以自己为祖先。
parent[m]=m;
第二步:根据题目条件(即他们之间有关系)对节点进行合并(使他们有共同祖先)
void unions(int a,int b)
{
int pa,pb;
pa=findparent(a);
pb=findparent(b);
if(pa!=pb){
parent[pa]=pb;
}
return ;
}
第三:合并的前提是找到两两之间是否存在共同的祖先(存在则不用再合并)带路径压缩
int findparent(int a){
int r=a;
while(r!=parent[r]){
r=parent[r];
}
while(a!=parent[a]){
int j=parent[a];
parent[a]=r;
a=j;
}
return r;
}