首页 > 其他分享 >天梯赛练习题 L3-003 社交集群 (简单并查集)

天梯赛练习题 L3-003 社交集群 (简单并查集)

时间:2023-03-23 21:56:02浏览次数:66  
标签:练习题 const LL 查集 003 hi 集群 社交 兴趣爱好

https://pintia.cn/problem-sets/994805046380707840/exam/problems/994805053141925888

题目大意:

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

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

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

其中(Ki>0)是兴趣爱好的个数,hi[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;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18,MINN=-MAXN;
const LL N=2e6+10,M=4004;
const LL mod=100000007;
const double PI=3.1415926535;
#define endl '\n'
LL a[N];
LL father[N];
void init()
{
    for(int i=1;i<=1000;i++)
    {
        father[i]=i;
    }
}
LL find(LL x)
{
    if(father[x]!=x) father[x]=find(father[x]);
    return father[x];
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        init();
        LL n;
        scanf("%ld",&n);
        for(int i=1;i<=n;i++)
        {
            LL op;
            scanf("%ld:%ld",&op,&a[i]);
            LL x=a[i];//标记第一个兴趣爱好
            for(int j=2;j<=op;j++)
            {
                LL y;
                scanf("%ld",&y);
                //和第一个兴趣爱好进行合并
                LL fx=find(x),fy=find(y);
                if(fx!=fy)
                {
                    father[max(fx,fy)]=min(fx,fy);
                }
            }
        }
        //从1-n个人中标记相同根(兴趣爱好)的人数
        map<LL,LL> mp;
        for(int i=1;i<=n;i++)
        {
            LL fai=find(a[i]);
            mp[fai]++;
        }
        vector<LL> v;
        for(int i=1;i<=1000;i++)
        {
            //出现过的才需要寻找,没出现过的不需要
            if(mp[i]!=0)
            {
                v.push_back(mp[i]);
            }
        }
        sort(v.begin(),v.end());
        reverse(v.begin(),v.end());
        LL flag=v.size();
        printf("%ld\n",flag);
        for(int i=0;i<v.size();i++)
        {
            if(i==v.size()-1) printf("%ld",v[i]);
            else printf("%ld ",v[i]);
        }
    }
    return 0;
}

标签:练习题,const,LL,查集,003,hi,集群,社交,兴趣爱好
From: https://www.cnblogs.com/Vivian-0918/p/17249600.html

相关文章

  • 并查集
    并查集主要包括初始化、寻根以及合并三个操作。例如a、b、c、d、e,初始化他们的祖先为本身。寻根操作:intfind_root(intx){//非路径压缩returnx==s[x]?x:finde_r......
  • 天梯赛练习题 L3-002 特殊堆栈(stl)
    https://pintia.cn/problem-sets/994805046380707840/exam/problems/994805053695574016输入样例:17PopPeekMedianPush3PeekMedianPush2PeekMedianPush1PeekM......
  • 3月日常练习题-1
    目录一、找1二、挑兵挑将三、水位线四、小码哥的跳棋游戏五、小码哥与机器人六、银行账户七、数字问题八、字符串的解码九、斐波那契,但是是字符串十、最大的平均值十一、数......
  • How Many Tables HDU - 1213(并查集/连通块数量)
    题意:朋友的朋友是朋友如果A认识B,B认识C,那么ABC三个人就可以坐在同一张桌子上但如果A认识B,C认识D,那我们就默认AB和CD不认识,需要准备两张桌子现在我们需要你计算出,我们一......
  • Stream流方法的一些简单练习题
    Stream流练习题1、数据过滤定义一个集合,并添加一些整数1,2,3,4,5,6,7,8,9,10过滤奇数,只留下偶数并将结果保存起来。/***@author戒爱学Java*@date2023/3/239:......
  • 2023-03-23_并查集
    并查集两个点之间在树或图中是否连通的问题。1什么是并查集?连接问题网络中节点间的连接状态数学中的集合类实现连接问题与路径问题:解决路径问题便一定可以解......
  • 并查集模板
    并查集(Union(并),Find(查),Set(集))一般用树的形式保存集合,但是是用数组模拟的树对于并查集树上的所有点,只有根结点是p[x]=x的,其他的p[x]都是父结点那么就可以通过whil......
  • 外设驱动库开发笔记52:PM3003S激光粉尘仪驱动
      空气质量是现代日常生活中人们所关注的事情,也是生存环境好坏的一种体现。其中粉尘数量监测更是空气质量检测中最常见的对象,在我们的检测设备中也经常会有这种需求。检......
  • 关于VMWare2.0上安装Windows Server 2003虚拟机无法识别网卡问题的求助
     VMwareTools的安装过程VMwareTools的安装程序事实上位于一个镜像文件里面(windows.iso),而且这个文件是和VMware主程序是在同一目录下的,首先我们要在CD-ROM这里把这个镜像......
  • TZOJ 1222: 数据结构练习题――先序遍历二叉树 层次遍历
    描述 给定一颗二叉树,要求输出二叉树的深度以及先序遍历二叉树得到的序列。本题假设二叉树的结点数不超过1000。 输入 输入数据分为多组,第一行是测试数据的组数......