1. 程式人生 > >PAT-L1-020. 帥到沒朋友

PAT-L1-020. 帥到沒朋友

並查集···

比賽時緊張···腦抽 沒寫出來···

不過15分的題····他們說不用並查集也能AC···

好吧···

我的思路:查詢該點ID時判斷 他的前驅結點Par[ID}是否為其本身並且他的孩子數為1(初始化本人為該ID的一個孩子)

那麼可以判斷 他沒有朋友圈或者他是個自戀狂(朋友圈只有他一人)····

#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
using namespace std;
const int Size = 100000;

int Par[Size];
int Visited[Size];
int Child[Size];

int Get_Par(int a){
    if( Par[a]!=a )
        return Par[a]=Get_Par(Par[a]);
    return Par[a];
}

void Merge(int a,int b){
    int ParA=Get_Par(a);
    int ParB=Get_Par(b);
    Par[ParA]=ParB;
    Child[ParB]+=Child[ParA];
    //cout<<a<<"'s father is "<<Get_Par(a)<<" "<<b<<"'s father is"<<Get_Par(b)<<endl;
}

int main()
{
    int N;int k;int T;
    int ID;

    cin>>N;
    for(int i=0; i<Size; i++){
        Par[i]=i;
        Child[i]=1;
    }

    memset(Visited,0,sizeof(Visited));
    //memset(Child,0,sizeof(Child));

    while(N--){
        cin>>k;

        cin>>T;k--;
        while(k--){
            cin>>ID;
            Merge(T,ID);
        }
        //cout<<T<<"'s child is "<<Child[T]<<endl;
        //cout<<ID<<"'s child is "<<Child[ID]<<endl;
    }
    int M;
    cin>>M;
    vector<int>Vec;
    while(M--){
        cin>>T;
        int ParT=Get_Par(T);
        if(!Visited[T]){
            Visited[T]=1;
            if(ParT==T&&Child[T]==1){
                Vec.push_back(T);
            }
        }
    }

    if(Vec.size()){
        for(int i=0; i<Vec.size(); i++){
            if(i)
                printf(" %05d",Vec[i]);
            else
                printf("%05d",Vec[i]);
        }
    }
    else
        cout<<"No one is handsome"<<endl;
}