并查集者,并也,查也,统统归于集合也。即其是关于集合的操作——并,查。所以并查集的关键也就是对集合的合并与对元素的查找,查找某一元素属于哪个集合。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
int father[50002],a,b,m,n,p;
int find(int x){
if (father[x]!=x) father[x]=find(father[x]);
return father[x];
}
int main(){
scanf("%d%d%d",&n,&m,&p);
for (int i=1;i<=n;i++) father[i]=i;
for (int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
a=find(a),b=find(b);father[a]=b;
}
for(int i=1;i<=p;i++){
scanf("%d%d",&a,&b);
a=find(a);b=find(b);
if(a==b)printf("Yes");else printf("No");
}
return 0;
}
可能下面的函数更加快速点。
int find(int x)
{
int r;
r=x;
while(flag[r]!=r)
r=flag[r];
int b=x;
int f;
while(b!=r)
{
f=flag[b];
flag[b]=r;
b=f;
}
}
void u(int x,int y)
{
int fx;
int fy;
fx=find(x);
fy=find(y);
if(flag[fx]!=fy)
flag[fx]=fy;
}