int uset[MAXSIZE];//根节点uset[]是自己
int rank[MAXSIZE];//集合层数
//并查集初始化
void makeSet(int size) {
for(int i=0;i<size;i++) uset[i] = i;
for(int i=0;i<size;i++) rank[i] = 1;
}
//查找根节点
int find(int x){
int p=x,t;
//找到自己根节点
while(uset[p]!=p)
p=uset[p];
//路径压缩,即将一路上节点的父节点都直接置为根节点
while(x!=p){
t=uset[x];
uset[x]=p;
x=t;
}
return p;
}
//并查集的合并
//rank[]:下标节点树高度
//规则:将较矮的树作为子树插入到较高的树中,这样最终树的高度不变;
//若是插入到较矮子树中的话,最后高度一定会高于原本两棵树的高度;
//而特殊情况,两棵树高度一样,则插到哪棵树哪棵树高度++;
void unionSet(int x, int y) {
x=find(x);
y=find(y);
if(x==y)
return;
if(rank[x]>rank[y])
uset[y]=x;
else{
uset[x] = y;
if(rank[x]==rank[y])
rank[y]++;
}
}
并查集
最新推荐文章于 2020-03-05 22:37:44 发布