L3-003. 社交集群

时间限制
1000 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

在社交网络平台注册时,用户通常会输入自己的兴趣爱好,以便找到和自己兴趣相投的朋友。有部分兴趣相同的人们就形成了“社交集群”。现请你编写程序,找出所有的集群。

输入格式:

输入的第一行给出正整数N(<=1000),即社交网络中的用户总数(则用户从1到N编号)。随后N行,每行按下列格式列出每个人的兴趣爱好:

Ki: hi[1] hi[2] ... hi[Ki]

其中Ki(>0)是第i个人的兴趣的数量,hi[j]是第i个人的第j项兴趣的编号,编号范围为[1, 1000]内的整数。

输出格式:

首先在第一行输出整个网络中集群的数量,然后在第二行按非递增的顺序输出每个集群中用户的数量。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

  1. 8
  2. 3: 2 7 10
  3. 1: 4
  4. 2: 5 3
  5. 1: 4
  6. 1: 3
  7. 1: 4
  8. 4: 6 8 1 5
  9. 1: 4

输出样例:

  1. 3
  2. 4 3 1

思路:并查集,两个人若有相同的兴趣,则在一个集合中。

AC代码:

  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #include<iostream>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<vector>
  7. #include<string>
  8. #include<iomanip>
  9. #include<map>
  10. #include<stack>
  11. #include<set>
  12. using namespace std;
  13. #define N_MAX 1000+2
  14. #define INF 0x3f3f3f3f
  15. int n;
  16. bool interest[N_MAX][N_MAX];
  17. vector<int>vec[N_MAX];
  18. int root[N_MAX];
  19. int statistic[N_MAX];
  20.  
  21. int par[N_MAX], Rank[N_MAX];
  22. void init(int n) {
  23. for (int i = ; i < n;i++) {
  24. par[i] = i;
  25. Rank[i] = ;
  26. }
  27. }
  28. int find(int x) {
  29. if (x == par[x])return x;
  30. else {
  31. return par[x] = find(par[x]);
  32. }
  33. }
  34.  
  35. void unite(int x,int y) {
  36. x = find(x);
  37. y = find(y);
  38. if (x == y)return;
  39. else {
  40. if (Rank[y] > Rank[x])par[x] = y;
  41. else {
  42. par[y] = x;
  43. if (Rank[x] == Rank[y])Rank[x]++;
  44. }
  45. }
  46. }
  47.  
  48. bool same(int x,int y) {
  49. return find(x) == find(y);
  50. }
  51.  
  52. bool cmp (const int &a,const int &b) {
  53. return a > b;
  54. }
  55.  
  56. int main() {
  57. while (scanf("%d", &n) != EOF) {
  58. memset(interest,,sizeof(interest));
  59. init(N_MAX);
  60. for (int i = ; i < n;i++) {
  61. int num; scanf("%d",&num);
  62. scanf(": ");
  63. while (num--) {
  64. int a; scanf("%d", &a);
  65. interest[i][a] = true;
  66. vec[i].push_back(a);
  67. }
  68. }
  69. for (int i = ; i < n;i++) {
  70. for (int j = i+; j < n;j++) {
  71. for (int k = ; k < vec[j].size();k++) {
  72. if (interest[i][vec[j][k]]) {
  73. unite(i, j); break;
  74. }
  75. }
  76. }
  77. }
  78. set<int>S; memset(statistic,,sizeof(statistic));
  79. for (int i = ; i < n;i++) {
  80. root[i] = find(i);
  81. S.insert(root[i]);
  82. statistic[root[i]]++;
  83. }
  84. printf("%d\n",S.size());
  85. sort(statistic, statistic + n,cmp);
  86. for (int i = ; i < S.size();i++) {
  87. printf("%d%c",statistic[i],i+==S.size()?'\n':' ');
  88. }
  89. }
  90. return ;
  91. }

pat 团体天梯 L3-003. 社交集群的更多相关文章

  1. PAT L3-003 社交集群

    https://pintia.cn/problem-sets/994805046380707840/problems/994805053141925888 当你在社交网络平台注册时,一般总是被要求填写 ...

  2. CCCC L2 部落 L3社交集群

    https://www.patest.cn/contests/gplt/L2-024 题解:部落是并查集模板题. 社交集群用并查集暴力有23分 坑:写了半天,发现自己并查集没怎么学明白,现在才搞懂: ...

  3. L3-003. 社交集群

    L3-003. 社交集群 题目链接:https://www.patest.cn/contests/gplt/L3-003 查并集 与L2-007(家庭房产)类似,都是采用了并查集的算法,相对来说这题处 ...

  4. pat 团体天梯 L3-011. 直捣黄龙

    L3-011. 直捣黄龙 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题是一部战争大片 —— 你需要从己方大本营出发,一路 ...

  5. pat 团体天梯赛 L3-007. 天梯地图

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  6. pat 团体天梯赛 L3-015. 球队“食物链”

    L3-015. 球队“食物链” 时间限制 1000 ms 内存限制 262144 kB 代码长度限制 8000 B 判题程序 Standard 作者 李文新(北京大学) 某国的足球联赛中有N支参赛球队 ...

  7. pat 团体天梯赛 L1-039. 古风排版

    L1-039. 古风排版 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 中国的古人写文字,是从右向左竖向排版的.本题就请你编写 ...

  8. pat 团体天梯赛 L2-012. 关于堆的判断

    L2-012. 关于堆的判断 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的小顶堆H[] ...

  9. pat 团体天梯赛 L3-010. 是否完全二叉搜索树

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

随机推荐

  1. Java 替换word文档文字,指定位置插入图片

    先说下 需要的依赖包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ex ...

  2. Linux监控一之Nagios的安装与配置

    一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...

  3. kubernetes搭建dashboard-v1.10.1

    一键部署脚本(或者可使用helm安装): wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/ ...

  4. videojs的使用

    [官网]http://www.videojs.com/ videojs就提供了这样一套解决方案,他是一个兼容HTML5的视频播放工具,早期版本兼容所有浏览器,方法是:提供三个后缀名的视频,并在不支持h ...

  5. mysql中的FROM_UNIXTIME()函数和UNIX_TIMESTAMP()函数

    unix_timestamp 是时间戳,可以用数据库里的存储时间数据的字段 from_unixtime 是将时间戳格式化为你想要时间

  6. 第9课 文章模块分析及建表 Thinkphp5商城第四季

    目录 文章模块的分析 表结构 文章模块的分析 表结构 CREATE TABLE `tp_cate` ( `id` smallint(6) NOT NULL AUTO_INCREMENT COMMENT ...

  7. Codeforces Round #461 (Div. 2) B. Magic Forest

    B. Magic Forest time limit per test 1 second memory limit per test 256 megabytes Problem Description ...

  8. Linux命令之---touch

    命令简介 linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 命令格式 touch [选项]... 文件... 命令参数 -a   或 ...

  9. RAID与LVM磁盘阵列技术

    RAID(Redundant Array of Independent Disks,独立冗余磁盘阵列) RAID概念: RAID技术通过把多个硬盘设备组合成一个容量更大.安全性更好的磁盘阵列,并把数据 ...

  10. java集群技术

    序言 越来越多的关键应用运行在J2EE(Java 2, Enterprise Edition)中,这些诸如银行系统和账单处理系统需要高的可用性(High Availability, HA),同时像Go ...