/*当前集合的根就是这个集合的祖先*/
#include <iostream>
using namespace std;
int father[10000+10];//下标代表儿子,数值代表当前儿子的父亲
void Unoin(int x,int y);//合并集合
int Find(int x);//查找祖先
int main()
{
int n,m,q;
cin>>n>>m>>q;
int a,b;
int c,d;
for(int i=1;i<=n;i++)
{
father[i]=i;//祖先的父亲是自己
}
for(int i=1;i<=m;i++)
{
cin>>a>>b;
if(Find(a)!=Find(b))
Union(a,b);
}
for(int i=1;i<=q;i++)
{
cin>>c>>d;
if(Find(c)==Find(d))
cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
int Find(int x)
{
int root=x;
while(father[root]!=root)//查找祖先
{
root=father[root];
}
while(root!=x)路径压缩
{
int t=father[x];
father[x]=root;
x=t;
}
}
void Unoin(int x,int y)
{
int r1=Find(x);
int r2=Find(y);
father[r1]=r2;//令x的祖先的父亲是y的祖先
}
并查集
最新推荐文章于 2024-07-29 20:58:50 发布