题意
并查集的简单应用
有一个数据点超时了,所以在合并式做了一点简单优化
源码
#include<iostream>
#include<map>
using namespace std;
int fa[10005];
int visit[100005];
int number[10005];
int myfind(int x){
if(x!=fa[x])
return myfind(fa[x]);
return x;
}
void myunion(int x,int y){
int fx=myfind(x);
int fy=myfind(y);
if(fx!=fy){
if(number[fx]>=number[fy]){
fa[fy]=fx;
number[fx]+=number[fy];
}else{
fa[fx]=fy;
number[fy]+=number[fx];
}
}
}
int main(){
for(int i=0;i<10005;i++){
fa[i]=i;
visit[i]=-1;
number[i]=1;
}
int n;
cin>>n;
int birdNumber=0,treeNumber=0;
for(int i=0;i<n;i++){
int num;
cin>>num;
int pre=-1;
for(int k=0;k<num;k++){
int temp;cin>>temp;
if(visit[temp]==-1){
birdNumber++;
visit[temp]=1;
}
if(k!=0){
myunion(pre,temp);
}
pre=temp;
}
}
for(int i=1;i<=birdNumber;i++){
if(fa[i]==i){
treeNumber++;
}
}
cout<<treeNumber<<" "<<birdNumber<<endl;
int query;cin>>query;
while(query--){
int x,y;
cin>>x>>y;
int fx=myfind(x);
int fy=myfind(y);
if(fx==fy){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
return 0;
}