const int maxn = 10004;
const int maxm = 200005;
int s[maxn],height[maxn];//树的高度
//初始化
void init_set(){
for(int i=1;i<=maxn;i++){
s[i] = i;
height[i] = 0;
}
}
//查询
/*int find_set(int x){
return x==s[x]?x:find_set(s[x]);
}*/
//查询-路径压缩
int find_set(int x){
if(x!=s[x]) s[x] = find_set(s[x]);
return s[x];
}
//循环实现查找 防止爆栈
/*int find_set(int x){
int r = x;
while(s[r] != r) r = s[r];
int i=x,j;
while(i != r){
j = s[i];
s[i] = r;
i = j;
}
return r;
}*/
//合并操作
void union_set(int x,int y){
x = find_set(x);
y = find_set(y);
if(height[x] == height[y]){
height[x] += 1;
s[y] = x;
}
else{
if(height[x]<height[y]) s[x] = y;
else s[y] = x;
}
}
并查集
最新推荐文章于 2023-05-12 16:29:23 发布