PTA 1118 Birds in Forest

题意:好几张图片,一张图片上的鸟在一棵树上。问有几棵树
思路:并查集
注意点:最后一个样例超时,优化一下并查集

#include
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<" "<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;
}

你可能感兴趣的:(PTA那些年过不去的测试点)