一个“社交集群”是指部分兴趣爱好相同的人的集合,看到这里就能看出来是一道并查集的题目,只不过要稍作修改。
题目中需求解的是每个集合的人数,我们可以在用并查集合并爱好的时候,维护集合的人数。具体地,初始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