适合解决的问题
- 连通子图
- 最小生成树Kruskal算法
- 最近公共祖先LCA
合并优化
通过记录高度,高度相同两者中取一个当作根节点,然后高度加1。高度不相同的,将高度矮的加到高度高的上面去,高树的高度不变。
void unions(int x,int y){
x=find(x);
y=find(y);
if(height[x]==height[y]){
s[x]=y;
height[y]+=1;
}else{
if(height[x]>height[y])
s[y]=x;
else s[x]=y;
}
}
查询优化(路径压缩)
在返回的时候顺便把i所属的集合改成根节点
int find(int x){
if(s[x]!=x) s[x]=find(s[x]);
return s[x];
}
两种优化方案选其中一个就可以了