题意:有n个人,每个人有k个爱好,如果两个人有某个爱好相同,他们就处于同一个集合。问总共有多少个集合,以及每个集合有多少人,并按从大到小输出。

  很明显,采用并查集。vis[k]标记爱好k第一次出现的人的编号,如果为0则表示未出现。

  当前第i个人若也存在爱好k,则只要将i与vis[k]两个人合并即可。

最后father[i]相同的即处在同一个集合中。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <string.h>
  5. #include <cmath>
  6. using namespace std;
  7. /*
  8. 并查集
  9. */
  10. const int maxn=;
  11. int vis[maxn]; //vis[i]标记某爱好第一次出现在第几个人,0表示还未出现。
  12. int n;
  13.  
  14. struct UF{
  15. int father[maxn];
  16. void init(){
  17. for(int i=;i<maxn;i++){
  18. father[i]=i;
  19. }
  20. }
  21. int find_root(int x){
  22. if(father[x]!=x){
  23. father[x]=find_root(father[x]);
  24. }
  25. return father[x];
  26. }
  27. void Union(int x,int y){
  28. int fx=find_root(x);
  29. int fy=find_root(y);
  30. if(fx!=fy){
  31. father[fy]=fx;
  32. }
  33. }
  34. }uf;
  35.  
  36. bool cmp(int a,int b){
  37. return a>b;
  38. }
  39. int main()
  40. {
  41. char str[];
  42. int num,a;
  43. scanf("%d",&n);
  44. memset(vis,-,sizeof(vis));
  45. uf.init();
  46. for(int i=;i<=n;i++){
  47. scanf("%s",str);
  48. int len=strlen(str);
  49. str[len-]='\0';
  50. num=atoi(str);
  51. for(int k=;k<num;k++){
  52. scanf("%d",&a);
  53. if(vis[a]==-)
  54. vis[a]=i;
  55. else{
  56. uf.Union(vis[a],i); //若已出现过,则第i个人与第vis[a]个人合并,即分为一组
  57. }
  58. }
  59. }
  60. int cnt[n+];
  61. int res=;
  62. memset(cnt,,sizeof(cnt));
  63. for(int i=;i<=n;i++){
  64. int idx=uf.find_root(i);
  65. if(cnt[idx]==)
  66. res++;
  67. cnt[idx]++;
  68. }
  69. sort(cnt+,cnt+n+,cmp);
  70. printf("%d\n",res);
  71. for(int i=;i<res;i++)
  72. printf("%d ",cnt[i]);
  73. printf("%d",cnt[res]);
  74. return ;
  75. }

PAT甲题题解-1107. Social Clusters (30)-PAT甲级真题(并查集)的更多相关文章

  1. 【PAT甲级】1107 Social Clusters (30分)(非递归并查集)

    题意: 输入一个正整数N(<=1000),表示人数,接着输入N行每行包括一个他的爱好数量:和爱好的序号.拥有相同爱好的人们可以默认他们在同一个俱乐部,输出俱乐部的数量并从大到小输出俱乐部的人数( ...

  2. [并查集] 1107. Social Clusters (30)

    1107. Social Clusters (30) When register on a social network, you are always asked to specify your h ...

  3. pat甲级 1107. Social Clusters (30)

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

  4. 1107 Social Clusters (30)(30 分)

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

  5. PAT (Advanced Level) 1107. Social Clusters (30)

    简单并查集. #include<cstdio> #include<cstring> #include<cmath> #include<vector> # ...

  6. PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)

    题意:给了图,以及s和t,让你求s到t花费的最短路程.最短时间,以及输出对应的路径.   对于最短路程,如果路程一样,输出时间最少的. 对于最短时间,如果时间一样,输出节点数最少的.   如果最短路程 ...

  7. 1107. Social Clusters (30)

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

  8. PAT甲级——1107 Social Clusters (并查集)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90409731 1107 Social Clusters (30  ...

  9. PAT-1107 Social Clusters (30 分) 并查集模板

    1107 Social Clusters (30 分) When register on a social network, you are always asked to specify your ...

随机推荐

  1. November 14th, 2017 Week 46th Tuesday

    Eternity is said not to be an extension of time but an absence of time. 永恒不是时间的无限延伸,而是没有时间. What is ...

  2. [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字

    [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...

  3. 极限编程核心价值:勇气(Courage)

    原文:https://deviq.com/courage 极限编程核心价值:简单(Simplicity) 极限编程核心价值:沟通(Communication) 极限编程核心价值:反馈(Feedback ...

  4. Geth命令用法-参数详解 and 以太坊源码文件目录

    本文是对以太坊客户端geth命令的解析 命令用法 geth [选项] 命令 [命令选项] [参数-] 版本 1.7.3-stable 命令 account 管理账户 attach 启动交互式JavaS ...

  5. MyBatis insert操作插入,返回主键from官方

    下面就是 insert,update 和 delete 语句的示例: <insert id="insertAuthor" parameterType="domain ...

  6. STL 1–迭代器std::begin()和std::end()使用

    迭代器是一个行为类似于指针的模板类对象.只需要迭代器iter指向一个有效对象,就可以通过使用*iter解引用的方式来获取一个对象的引用.通常会使用一对迭代器来定义一段元素,可以是任意支持迭代器对象的元 ...

  7. P1312 Mayan游戏

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  8. 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明

    程序发布后出现问题: 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明 解决办法: 1.安装了odac12.  ODTwithODAC121010.z ...

  9. jqgrid 获取远端数据失败时,弹出错误提示

    有时,我们给jqgrid绑定的远端数据获取失败,此时,需要把错误信息反馈给用户展示,如何实现? 可通过jqgrid的 loadError 来处理错误数据的返回.详细如下: $("#jqGri ...

  10. 解决Win10家庭版没有‘本地用户和组’问题

    今天偶然发现我的win10系统是家庭版,并且没有本地用户和组. 处理方法:将系统升至为win10专业版,然后下载microKMS_v17.02.14做的激活.参考网站 1.打开运行窗口,输入 gped ...