![在这里插入图片描述](https://img-blog.csdnimg.cn/20201027184618447.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Nhd2Frb19T,size_16,color_FFFFFF,t_70#pic_center
- 注意:并完以后有些元素可能指向父亲并没有指向祖先,查询时需要find()一遍。
c++代码:
const ll MAX=1e5+10;
int a[MAX],b[MAX];
int find(int x){
if(a[x]==x) return x;
else{
return a[x]=find(a[x]);
}
}
void solve()
{
for(int i=1;i<=MAX;i++){
a[i]=i;
}
int t;cin >>t;
int x,y;
while(t--){
int n;cin >>n;
cin >>x;
b[x]=1;
for(int i=2;i<=n;i++){
cin >>y;
b[y]=1;
a[max(find(x),find(y))]=min(find(x),find(y));
}
}
int ans1=0,ans2=0;
for(int i=1;i<=MAX;i++){
if(b[i]==1) ans1++;
}
for(int i=1;i<=MAX;i++){
if(a[i]!=i) ans2++;
}
cout <<ans1<<" "<<ans1-ans2<<endl;
cin >>t;
while(t--){
cin >>x>>y;
int xx=find(x),yy=find(y);
if(xx==yy) cout <<"Y"<<endl;
else cout <<"N"<<endl;
}
}
int main()
{
int t;
/*cin >>t;
while(t--) */solve();
//system("pause");
return 0;
}