问题
例子:现在有若干家族图谱关系,给出了一些亲戚关系,如Marry和Tom是亲戚,Tom和Ben是亲戚等等。从这些信息中,你可以推导出Marry和Ben是亲戚。请写一个程序,对于我们的关于亲戚关系的提问,以最快速度给出答案
输入格式
第一部分是以N,M开始。N为人数(1<=N<=20000),这些人的编号为1,2,3,.,N。.下面有M行(1<=M<=1000000),每行有两个数a,b,表
示a和b是亲戚。
第二部分是以Q开始。以下Q行有Q个询问(1<=Q<=1000000),每行为c,d,表示询问c和d是否为亲戚。
输出格式
对于询问c,d,输出一行:若c,d为亲戚,则输出"YES",否则输出"NO"。
输入样例
10 7
2 4
5 7
1 3
8 9
1 2
5 6
2 3
3
3 4
7 10
8 9
输出样例
yes
no
yes
#include<iostream>
using namespace std;
int fa[20007];
int Find(int zll){
if(zll==fa[zll])
return zll;
else
fa[zll]=Find(fa[zll]);//赋值给fa[zll]实现路径压缩
return fa[zll];
}
void Union(int x,int y){
int s1=Find(x);
int s2=Find(y);
fa[s1]=s2;//s1的亲戚或祖先是s2
}
int main()
{
int n,m,p,a,b,a1,b1;
cin>>n>>m;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=0;i<m;i++){
cin>>a>>b;
Union(a,b);
}
cin>>p;
for(int i=0;i<p;i++){
cin>>a1>>b1;
if(Find(a1)==Find(b1))
cout<<"Yes"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}