L3-003 社交集群 (30 分)(并查集)

简介: L3-003 社交集群 (30 分)(并查集)

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


输入格式:

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


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


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


输出格式:

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


输入样例:

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


思路:把兴趣爱好的编号标记为拥有这个兴趣爱好的人的编号,标记的时候判断一下,如果当前兴趣爱好的编号已经标记过了,就说明当前的人与之前标记的人具有相同的爱好,然后把他们合并一个集合里面

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int p[N],cnt[N],vis[N];
vector<int>ans;
int find(int x)
{
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}
int main()
{
    int n,k,x;
    char op;
    cin>>n;
    for(int i=1;i<=n;i++) p[i]=i;
    for(int i=1;i<=n;i++)
    {
        cin>>k>>op;
        while(k--)
        {
            cin>>x;
            if(vis[x]) p[find(vis[x])]=find(i);
            else vis[x]=i;
        }
    }
    for(int i=1;i<=n;i++)
        cnt[find(i)]++;
    for(int i=1;i<=n;i++)
        if(cnt[i]) ans.push_back(cnt[i]);
    sort(ans.rbegin(),ans.rend());//逆序
    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i++)
    {
        if(i) cout<<' ';
        cout<<ans[i];
    }
    return 0;
}


目录
相关文章
|
存储 关系型数据库 MySQL
mysql数据库查询时用到的分页方法有哪些
【8月更文挑战第16天】在MySQL中,实现分页的主要方法包括:1)使用`LIMIT`子句,简单直接但随页数增加性能下降;2)通过子查询优化`LIMIT`分页,提高大页码时的查询效率;3)利用存储过程封装分页逻辑,便于复用但需额外维护;4)借助MySQL变量实现,可能提供更好的性能但实现较复杂。这些方法各有优缺点,可根据实际需求选择适用方案。
1016 2
|
存储 SQL Java
Spring Boot使用slf4j进行日志记录
本节课主要对 slf4j 做了一个简单的介绍,并且对 Spring Boot 中如何使用 slf4j 输出日志做了详细的说明,着重分析了 logback.xml 文件中对日志相关信息的配置,包括日志的不同级别...
|
Java Spring
SpringBoot: 启动Banner在线生成工具
SpringBoot: 启动Banner在线生成工具
36002 1
SpringBoot: 启动Banner在线生成工具
|
敏捷开发 测试技术
开发模型(瀑布、螺旋、scrum) 和 测试模型(V、W)、增量和迭代、敏捷(思想)及敏捷开发 scrum
文章详细介绍了软件开发过程中的不同开发模型(瀑布、螺旋、Scrum)和测试模型(V模型、W模型),以及增量和迭代的概念,最后阐述了敏捷思想及其在敏捷开发(如Scrum)中的应用。
1550 0
开发模型(瀑布、螺旋、scrum) 和 测试模型(V、W)、增量和迭代、敏捷(思想)及敏捷开发 scrum
|
网络协议 Linux 网络安全
SYN Cookie技术原理
【8月更文挑战第21天】
618 1
|
缓存 分布式计算 数据处理
|
Java 开发者
Java中什么是竞态条件
【8月更文挑战第10天】Java中什么是竞态条件
267 0
|
C++
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
362 1
|
算法 Java
Java快读快写
Java快读快写
|
SQL 存储 分布式计算
Hive、Hbase、mysql的区别
1、Hive和HBase的区别   1)hive是sql语言,通过数据库的方式来操作hdfs文件系统,为了简化编程,底层计算方式为mapreduce。   2)hive是面向行存储的数据库。   3)Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑。   4)HBase为查询而生的,它通过组织起节点內所有机器的內存,提供一個超大的內存Hash表 。   5)hbase不是关系型数据库,而是一个在hdfs上开发的面向列的分布式数据库,不支持sql。   6)hbase是物理表,不是逻辑表,提供一个超大的内存hash表,搜索引擎通过它来存储索引
858 0