哔哩哔哩2019笔试题--聚会

本文通过并查集算法解决了一个社交活动场景下的问题,即计算活动结束后参与者最多能认识多少人。利用并查集的数据结构,有效地处理了n个人之间的m对认识关系,通过不断合并集合来更新参与者之间的连接状态,最终确定了小A能够认识的人数。

小A参加了一个n人的活动,每个人都有一个唯一编号i(i>=0 & i<n),其中m对相互认识,在活动中两个人可以通过互相都认识的一个人介绍认识。现在问活动结束后,小A最多会认识多少人?

算法:并查集

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>f;
int find(int x){
    return x==f[x]?x:f[x]=find(f[x]);
}
int main(void){
    int n,idx,m;
    cin>>n>>idx>>m;
    f=vector<int>(n);
    for(int i=0;i<n;i++)f[i]=i;
    int ans(0),b(0);
    while(m--){
        int one, two;
        scanf("%d,%d", &one, &two);
        if(one==idx||two==idx)b++;
        int fx=find(one),fy=find(two);
        if(fx!=fy)f[fx]=fy;
    }
    for(int i=0;i<n;i++)
        if(find(idx)==find(i))ans++;
    cout<<ans-b-1<<endl;
    return 0;
}

 

转载于:https://www.cnblogs.com/programyang/p/11147576.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值