Description
某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。(人数≤5000,询问亲戚关系次数≤5000)。
Input
第一行为数据组数T(T <= 20)
对于每组数据,第一行有两个整数n、m(1 <= n, m <= 5000),表示有n个人,编号1~n,其中存在m个亲戚关系
接下来m行,每行有两个整数u、v(u != v, 1 <= u, v <= n),表示u和v之间有亲戚关系
然后是询问组数q(1 <= q <= 5000)
接下来q行,每行有两个整数u、v(u != v, 1 <= u, v <= n),询问u和v之间是否有亲戚关系
Output
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
int father[50002],a,b,m,n,p;
//找到x的祖先
int find(int x){
if(father{x} != x){
father[x] = find(father[x]);
return father[x];
}
}
int main(){
int q;
cin>>q;
while(q--){
cin>>n>>m;
for(int i=1;i<=n;i++){
father[i] = i;
}
for(int i=1;i<=m;i++){
cin>>a>>b;
a = find(a);
b = find(b);
father[a] = b;
}
cin>>p;
for(int i=1;i<=p;i++){
cin>>a>>b;
a = find(a);
b = find(b);
if(a == b){
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
}
if(q != 0){
cout<<endl;
}
}
return 0;
}
对于每组数据,输出q行,每行为"Yes"或"No",表示是否存在亲戚关系
每组数据的输出用空行隔开