并查集常用来解决不相交集合的合并问题,在加入路径压缩和合并后,具有非常好的时间和空间复杂度。
#include<iostream>
using namespace std;
int father[100];
int find(int &x)
{
int r=x;
int i,j;
while(father[r]!=r)
r=father[r];
i=x;
while(i!=r) //路径压缩
{
j=father[i];
father[i]=r;
i=j;
}
return r;
}
void join(int &x,int &y) //合并
{
if(find(x)==find(y))
return;
father[y]=find(x);
}
int main()
{
int n,m;
int a,b;
int i=0;
cin>>n>>m;
for(;i<n;++i)
{
father[i]=i; //初始化
}
for(i=0;i<m;++i)
{
cin>>a>>b;
join(a,b); //合并
}
cout<<"Input"<<endl;
i=2;
while(i--)
{
cin>>a>>b;
a=find(a);
b=find(b);
if(a!=b)
cout<<"No"<<endl;
else{
cout<<"Yes"<<endl;
}
}
return 0;
}