这道题目给出的示例如上图所示,一共有1-8这8个人(圆形),他们拥有1-10这10个兴趣爱好(方形),一人可以有多个爱好,拥有共同爱好的人被视为一个社区的。现在给出每个人的爱好情况,求出社区的个数,并按照从大到小将社区的人数输出。

1. 起初我测试点1不通过,因为试图用一个vector<int> hobby[maxn]的数据结构,把每个社区的人的编号都读入,然后再和第一个人进行合并。实际上完全可以用int hobbyFirst[maxn],将该社区的第一个人的编号读入,再有来者,把来着和这第一个人合并到同一社区即可。(边读入,边合并)

2. 这是并查集下的一道题,所以一定会有父亲数组F[maxn],另外还开了一个数组number[maxn],用于记录每个社区的人数(不需要知道每个社区有哪些人,只需要知道有多少人),并且直接对其排序后输出。

3. 查找和合并函数要会写,没什么好说的,就是合并函数我起初写的时候最后一个不是把两个根节点合并,这点要注意。

AC代码

#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#include<cmath>
typedef long long LL;using namespace std;const int maxn = 1010;int F[maxn];//存放每个节点的父亲节点
int number[maxn] = {0};//存放每个社区的人数 int findSource(int x){int a = x;while(x!=F[x]){x = F[x];}//压缩路径 while(a!=F[a]){int z = a;a = F[a];F[z] = x;  }return x;
}void unite(int a,int b){//将a和b所在的集合合并 int sa = findSource(a);int sb = findSource(b);if(sa!=sb){F[sa] = sb;}
}int main(){int n;//总人数 int hobbyFirst[maxn] = {0};//hobby[i]存放的是拥有i这个爱好的第一个人的编号 scanf("%d",&n);int num,idx;char c;//将所有人都初始化为根节点    for(int i=1;i<=n;i++){F[i] = i;}for(int i=1;i<=n;i++){scanf("%d:%c",&num,&c);//读入当前这个人的爱好个数 for(int j=0;j<num;j++){scanf("%d",&idx);//读入当前爱好编号 if(hobbyFirst[idx]==0)hobbyFirst[idx] = i;//如果这个爱好是第一次有人喜欢 else unite(i,hobbyFirst[idx]);//把当前这个人和拥有这个爱好的第一人放到同一个社区 }}for(int i=1;i<=n;i++){int sidx = findSource(i);number[sidx]++;//该社区的人数 }sort(number+1,number+1001);int lastIdx;for(int i=1000;i>=1;i--){if(number[i]==0){lastIdx = i;//997break;}} printf("%d\n",1000-lastIdx);for(int i=1000;i>lastIdx;i--){printf("%d",number[i]);if(i!=lastIdx+1)printf(" ");}return 0;
}

1107 Social Clusters相关推荐

  1. PAT甲级1107 Social Clusters (30 分):[C++题解]并查集,爱好、人数

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 凭爱好,分人群.注意点:爱好可传递.什么意思?意思是A和B的有共同爱好1, B和C有共同爱好2,那么认为A和C也是同一群人. 按照爱 ...

  2. 使用 图论 解决PAT甲级1107 Social Clusters

    题目 When register on a social network, you are always asked to specify your hobbies in order to find ...

  3. 1107 Social Clusters (30 分)【难度: 中 / 知识点: 并查集】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805361586847744 很不错的一个并查集的操作.你会发现我们需要处 ...

  4. PAT (Advanced Level) Practice - 1107 Social Clusters(30 分)

    题目链接:点击打开链接 题目大意:一个"社交集群"是指部分兴趣爱好相同的人的集合.你需要找出所有的社交集群. 解题思路:并查集思路,轮到第几个人时,以它的 id 为 root,然后 ...

  5. PAT A1107 Social Clusters ——过尽千帆皆不是

    PAT A1107 Social Clusters 知道应该是并查集,但是忘了并查集怎么写,于是先用了俩二维数组存储遍历试了一下,只能得20分,原因是第三层for循环找到爱好对应的人加入之后,就不再管 ...

  6. 刷PAT甲级的各题思路、细节以及遇到的问题记录

    1001 A+B Format (20分) 因为一定会用到字符串,而string非常好用,但是用的时候一定要注意不能越界访问,否则会在运行时出现abort() has been called. 100 ...

  7. PAT甲级真题目录(按题型整理)(转自柳神)

    转载自:https://www.liuchuo.net/archives/2502?tdsourcetag=s_pcqq_aiomsg 最短路径 1003. Emergency (25)-PAT甲级真 ...

  8. 【PAT甲级】A1101-A1155刷题记录

    文章目录 (递推) A1101 Quick Sort (25 分) 0.23 (静态二叉树+遍历) A1102 Invert a Binary Tree (25 分) 0.51 (数学问题) A110 ...

  9. 【置顶】【PAT】PAT甲级题目及分类总结(持续更新ing)

    在2019年3月底,我决定考浙大计院,经过一个月还算凑合的学习,痛定思痛,决定整理整理自己的博客. 粗略估计,大概一个月的时间里我AC了31道题,大概用时40个小时上下,毕竟还要把大部分时间花在笔试上 ...

最新文章

  1. 【多标签文本分类】Ensemble Application of Convolutional and Recurrent Neural Networks for Multi-label Text
  2. dat关闭某进程_超详细解析!工程师必会的Linux进程间通信方式和原理
  3. python读取csv某一列存入数组_python 读取.csv文件数据到数组(矩阵)的实例讲解
  4. 基于Java的Selenium学习笔记——Assert
  5. 聊一聊对外API接口的存活检查可以怎么做
  6. CentOS安装运行NodeJS框架Express
  7. Spark 机器学习拾遗
  8. 将当前登录用户去重显示。
  9. c语言大华面试题,大华股份的一道笔试题 C/C++
  10. 对抗神经网络(Adversarial Nets)的介绍[1]
  11. PC端微信图片的解密
  12. android音乐同步到iphone,安卓手机上的音乐还能转移到iPhone,你信不信
  13. 【文本检测与识别-白皮书-3.1】第四节:算法模型 2
  14. 社会保障psam卡 是什么_社会卡即服务
  15. vue中注释里@xxx是什么意思呢???
  16. 小程序、APP Store 需要的 SSL 证书是个什么东西?
  17. CSDN明星博主Leo新作——《程序员羊皮卷》即将隆重上市
  18. matlab中pwelch函数计算功率谱密度
  19. 超级计算机控制人的电影,想知道这部电影的名字,讲述通过超级计算机进入人脑.回到过去.其中有个老教授死亡留下一封信给给主角。...
  20. 预算不是很充足,但想体验到顶级旗舰机?建议看看去年的旗舰

热门文章

  1. 微信小程序模块化开发 include与模板开发 template
  2. 史上第二走心的 iOS11-Drag Drop 教程
  3. 互动网计算机频道图书7日销售排行(05.20-05.26)
  4. RRDTool原理简介
  5. 在自己的网站添加关注新浪关注按钮
  6. postfix邮件服务器搭建
  7. UML部署图(转载)
  8. Swift2.0系列]Error Handling(项目应用篇)
  9. 自动红眼移除算法 附c++完整代码
  10. Linux---管理网络