并查集主要有两部分
1.并
2.查
combine函数(并)
void combine(int a,int b){
int ffa=find(a);
int ffb=find(b);
if(ffa!=ffb){
fa[ffa]=ffb;
}
}
find函数(查)
int find(int a){
int b=a;
while(a!=fa[a]){
a=fa[a];
}
while(b!=a){
int temp=fa[b];
fa[b]=a;
b=temp;
}
return a;
}
这里有个路径压缩,可以更快速的查找(路径压缩不懂可以点这里)
完整代码是洛谷的并查集模板题
#include <stdio.h>
int fa[100010];
int find(int a){
int b=a;
while(a!=fa[a]){
a=fa[a];
}
while(b!=a){
int temp=fa[b];
fa[b]=a;
b=temp;
}
return a;
}
void combine(int a,int b){
int ffa=find(a);
int ffb=find(b);
if(ffa!=ffb){
fa[ffa]=ffb;
}
}
int main(){
int i,j,n,m;
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++){
fa[i]=i;
}
while(m--){
int z,x,y;
scanf("%d%d%d",&z,&x,&y); //z=1合并 ,z=2判断是否为同一集合
if(z==1){
combine(x,y);
}else{
if(find(x)==find(y)) printf("Y\n");
else printf("N\n");
}
}
return 0;
}