当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友。一个“社交集群”是指部分兴趣爱好相同的人的集合。你需要找出所有的社交集群。

输入格式:

输入在第一行给出一个正整数 N(≤1000),为社交网络平台注册的所有用户的人数。于是这些人从 1 到 N 编号。随后 N 行,每行按以下格式给出一个人的兴趣爱好列表:

K​i​​: h​i​​[1] h​i​​[2] ... h​i​​[K​i​​]

其中K​i​​(>0)是兴趣爱好的个数,h​i​​[j]是第j个兴趣爱好的编号,为区间 [1, 1000] 内的整数。

输出格式:

首先在一行中输出不同的社交集群的个数。随后第二行按非增序输出每个集群中的人数。数字间以一个空格分隔,行末不得有多余空格。

输入样例:

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

输出样例:

3
4 3 1

#include<bits/stdc++.h>
using namespace std;
int p[],ai[],cir[];
int find(int r)
{
if(p[r]!=r)
p[r]=find(p[r]);
return p[r];
}
void join(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy)
p[fx]=fy;
}
int main()
{
int n,i,j,k,x;
char ch;
cin>>n;
for(i=;i<=;i++)
p[i]=i; for(i=;i<=n;i++)
{
cin>>k>>ch;
for(j=;j<=k;j++)
{
cin>>x;
if(ai[x]==)ai[x]=i;//i号人作为爱好x的父亲
join(i,find(ai[x]));//将i号人与爱好x的人群连接
}
}
int sum=;
for(i=;i<=n;i++)
cir[find(i)]++;
sort(cir+,cir+,greater<int>());//按从大到小排序
for(i=;i<=;i++)
{
if(cir[i]==)
{
i--;
break;
}
}
cout<<i<<endl;
for(j=;j<=i;j++)
{
if(j==)cout<<cir[j];
else cout<<" "<<cir[j];
}
cout<<endl;
return ;
}

最新文章

  1. Coding List
  2. Android中自定义控件TextSize属性问题
  3. Enum是如何用的?
  4. 在FreeBSD上安装Bugzilla
  5. Win7 64位系统上配置使用32位的Eclipse(转)
  6. Android清理设备内存具体完整演示样例(一)
  7. Mariadb Galera Cluster 群集 安装部署
  8. Spring Security 入门(1-3-5)Spring Security - remember me!
  9. Lesson 25 Do the English speak English?
  10. liunx redis集群添加密码
  11. printf打印输出
  12. 第一次提交 nacos 代码
  13. python数学第一天【极限存在定理】
  14. linux之xxx 不在 sudoers 文件中,此事将被报告(转载)
  15. mysql解决数据库死锁问题
  16. 查看Linux进程CPU过高具体的线程堆栈(不中断程序)
  17. 纯css控制文字2行显示多余部分隐藏
  18. 如何在xml中设置textview不可见
  19. Git Step by Step – (2) 本地Repo
  20. JS 数组和对象的遍历方式,以及几种方式的比较。

热门文章

  1. Web Api ——创建WebAPI
  2. numpy数组属性查看及断言
  3. Linux yum提示Loaded plugins错误的解决方法
  4. 解决nginx使用proxy_pass反向代理时,session丢失的问题
  5. css 笔记1
  6. php读取大文件如日志文件
  7. [日常]蒟蒻的高一生活 Week 1~3
  8. ubuntu 13.04添加 flash_plugin
  9. N个苹果分给M个人,有多少种分法
  10. Linux系统之路——如何在服务器用U盘安装CentOS7.2(一)