1.数据结构
int parent[n];
解释:parent[i]
即元素[i]
的上一个连通结点(父节点)(想象一棵树中结点的父节点)
2.查找&合并 - 版本1
非路径压缩
int Find(int i){
while(i != parent[i]) i = parent[i];
return i;
}
移花接木大法
void Union(int i, int j){
i = Find(i);
j = Find(j);
pre[i] = j;
}
3.查找&合并 - 版本2 (稳定、推荐)
路径压缩
int Find(int i){
while(i != parent[i]){
parent[i] = parent[ parent[i] ]; // 为下一次查找[i]进行了路径压缩
i = parent[i];
}
}
按秩合并
void Union(int i, int j){
i = Find(i);
j = Find(j);
if(Num[i] > Num[j]) {
parent[j] = i;
Num[i] = Num[i] + Num[j];
}else{
parent[i] = j;
Num[j] = Num[i] + Num[j];
}
}