【团体程序设计天梯赛】L3-003社交集群

一个“社交集群”是指部分兴趣爱好相同的人的集合,看到这里就能看出来是一道并查集的题目,只不过要稍作修改。

题目中需求解的是每个集合的人数,我们可以在用并查集合并爱好的时候,维护集合的人数。具体地,初始f数组均为0,指此前没有出现过。

对每个人的爱好,我们判断第一个爱好x是否出现过,如果没有出现过,就令f[x]=x,指以爱好x为首领建立集合,且集合人数num[x]=1;如果出现过,用find(x)找到x所在集合的首领fx,使fx集合的数量num[fx]+1(同时令x=fx,便于后序合并);

依次读入第2、3、...、k个爱好,对第k个爱好y,判断爱好y是否出现过,如果没有出现过,直接令y合并到x集合中,数量不变(因为我们在合并同一个人的爱好);如果出现过,用find(y)找到y所在集合的首领fy,合并x与y的集合,令f[fy]=x,同时人数也要更新,num[x]+=num[fy]。

#include <iostream>
#include <algorithm>
#include <vector>
#define N 1010
using namespace std;

int n,f[N],num[N],k,x,y;//f记录首领,num记录人数
ve
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值