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;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值