AC代码:
#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
int father[10005];
int findRoot(int x){//查找根节点
if(x==father[x]) return x;
else{
int F = findRoot(father[x]);//路径压缩了
father[x]=F;
return F;
}
}
void unionRoot(int a,int b){
a = findRoot(a);
b = findRoot(b);
if(a!=b){
father[a]=b;
}
}
int main()
{
set<int> ss,st;//分别存储社区人数和部落数
for(int i=0;i<10001;i++){
father[i]=i;
}
int N;
int x;
int temp[10001];
int Q;
scanf("%d",&N);
while(N--){
getchar();
cin>>x>>temp[0];
ss.insert(temp[0]);
for(int i=1;i<x;i++){
cin>>temp[i];
unionRoot(temp[0],temp[i]);
ss.insert(temp[i]);
}
}
for(auto i:ss){
st.insert(findRoot(i));
}
printf("%d %d\n",ss.size(),st.size());
cin>>Q;
int a,b;
while(Q--){
cin>>a>>b;
if(findRoot(a)!=findRoot(b)){
printf("N\n");
}else{
printf("Y\n");
}
}
system("pause");
return 0;
}