题意:好几张图片,一张图片上的鸟在一棵树上。问有几棵树
思路:并查集
注意点:最后一个样例超时,优化一下并查集
#include<bits/stdc++.h>
using namespace std;
int bird[10005];
int tr[10005];
int init(){
for(int i=1;i<10004;i++){
tr[i]=i;
}
}
int findfa(int x){
int tmp=x;//tmp是根节点
while(tmp!=tr[tmp]){
tmp=tr[tmp];
}
int w=x;
while(w!=tr[w]){//更新这个节点的所有前驱节点的父节点为根节点
tr[w]=tmp;
w=tr[w];
}
return tmp;
}
int main(){
int n;
cin>>n;
int sum=0;
init();
for(int i=1;i<=n;i++){
int k;
cin>>k;
int b;
while(k--){
cin>>b;
if(bird[b]==0){
sum++;
bird[b]=i;
}else{
int fa=findfa(i),fb=findfa(bird[b]);
if(fa!=fb){
tr[fa]=fb;
}
}
}
}
int tsum=0;
for(int i=1;i<=n;i++){
if(tr[i]==i)
tsum++;
}
cout<<tsum<<" "<<sum<<endl;
int k;
cin>>k;
while(k--){
int a,b;
cin>>a>>b;
if((bird[a]==bird[b])||(findfa(bird[a])==findfa(bird[b]))){
cout<<"Yes\n";
}else{
cout<<"No\n";
}
}
return 0;
}