思路:
很明显的并查集的题目,每个输入给出的小圈子里的人都合并并查集,可以让每行后几个人加入第一个人的并查集中,最后有几个x=p[x]就有几个圈子。人数的问题,可以把接收到的都放set里,set的size就是总人数。
代码:
#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
int n,k,cnt,a,b,q;
int p[10010];
set<int> s;
int find(int x){
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main(){
for(int i=1;i<10010;i++) p[i]=i;
cin>>n;
for(int i=0;i<n;i++){
cin>>k;
cin>>a;
s.insert(a);
for(int j=0;j<k-1;j++){
cin>>b;
s.insert(b);
if(find(a)!=find(b)) p[find(b)]=find(a);
}
}
for(int i=1;i<=s.size();i++){
if(p[i]==i) cnt++;
}
cout<<s.size()<<' '<<cnt<<endl;;
cin>>q;
for(int i=0;i<q;i++){
cin>>a>>b;
if(find(a)==find(b)) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
system("pause");
}