并查集
双亲法表示各棵树(所有集合的元素个数N):
int Tree[N];
Tree[i]表示结点i的双亲结点
若Tree[i]为-1 则表示该节点不存在双亲结点,即为根节点。
查找结点x所在树的根节点–附带路径压缩:
int findRoot(int x){
if(Tree[x]==-1)
return x;
else{
int tmp = findRoot(Tree[x]);
Tree[x]=tmp;
return tmp;
}
}
两集合合并
必须找到father结点,再插入。
void Union(int a, int b){
int faA = findRoot(a);
int faB = findRoot(b);
if(faA!=faB){
father[faA] = faB;
}
}