#include<iostream>
#include<set>
using namespace std;
int fa[10005]={0};
int findFather(int x){
int a=x;
while(x!=fa[x]) //不断向上查直到根节点
x=fa[x];
while(a!=fa[a]){ //压缩查找路径
int temp=a; //查找途径上的fa[a]=x
a=fa[a];
fa[temp]=x;
}
return x;
}
void Union(int a,int b){
int faA=findFather(a);
int faB=findFather(b);
if(faA!=faB) fa[faB]=faA; //根不同,合并
}
int main(){
for(int i = 1; i < 10005; i++)
fa[i] = i;
int n,k,id,temp;
set<int> s1,s2; //s2多少棵树,s1多少种鸟
cin>>n;
for(int i=0;i<n;i++){
cin>>k>>id;
s1.insert(id); //鸟的种类
for(int j=1;j<k;j++){
cin>>temp;
Union(id,temp);
s1.insert(temp);
}
}
for(auto it=s1.begin();it!=s1.end();it++) //查找鸟的所属集合种类即多少棵树
s2.insert(findFather(*it));
printf("%d %d\n", s2.size(), s1.size());
int m,ida,idb;
cin>>m;
for(int i=0;i<m;i++){
cin>>ida>>idb;
printf("%s\n",(findFather(ida) == findFather(idb)) ? "Yes" : "No");
}
system("pause");
return 0;
}
PAT 1118 Birds in Forest (25 分) 并查集Find+Union+set
于 2022-02-08 11:09:14 首次发布