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

2023-12-02 15:58
文章标签 30 查集 social clusters 1107

本文主要是介绍1107. Social Clusters (30)[并查集],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 原题: https://www.patest.cn/contests/pat-a-practise/1107

2. 思路:

题意:
根据共同的兴趣找出共有几个圈子。
思路:
并查集问题。
根据题意,很容易知道是关于集合的问题。对于集合问题,并查集是最简单的。
当然可以用bfs,但是没有并查集算法简捷。


并查集其实就两个函数,一个合并,一个查找根。
两个数组s和hobby。
初始时s[i]= -1, 表示每个人都是根。(根时,值的绝对值表示该集合人数)。
对于爱好,初始时,hobby[i] = 0,即无人有该爱好。
读入数据,对于k号的j个爱好,若该爱好i无人,那么hobby[i] = k,即k号有爱好i。
若该爱好i已经有人了(hobby[i] != 0), 那么说明这两个人可以是一个圈子,进行合并就好了。
所以,当读完数据时,集合也合并好了。


此时,我们要知道每个集合的根值是负值,非负则不是根。
那么我们升序排序,越小说明圈子人越多。
最后输出负值的圈子。
已AC。

3. 源码:

#include<iostream>
#include<vector>
#include<algorithm>//使用sort函数
using namespace std;int N;//总人数
vector<int> s;//存储圈子的情况,s[i]表示编号i的人的父结点号。
vector<int> hobby(1001, 0);//下标为兴趣编号,值表示拥有该兴趣的人的编号。void Union(int root1, int root2);//并查集的合并两个集合, 参数是两个集合的根(某人的编号)。
int FindRoot(int x);//并查集的查找集合的根, 参数是人的编号int main(void)
{//freopen("in.txt", "r", stdin);scanf("%d", &N);s.resize(N + 1, 0);//编号从1起for (int i = 1; i <= N; i++)//读入数据并进行处理合并{s[i] = -1;//并查集的初始化int num;//每个人的爱好数scanf("%d: ", &num);for (int j = 0; j < num; j++){int type;//爱好编号scanf("%d", &type);if (hobby[type] == 0)//第一次有人有该爱好,相当于该人可以作为集合的跟了,后面人都指向他。hobby[type] = i;else{int r1 = FindRoot(i);//找到i这个人的根int r2 = FindRoot(hobby[type]);//找到有这个爱好的人所在圈子的根Union(r1, r2);//合并两个圈子}}}sort(s.begin(), s.end());//升序int cnt = 0;//记录圈子数for (int i = 0; i < s.size() && s[i] < 0; i++)cnt++;printf("%d\n", cnt);for (int i = 0; i < cnt; i++){if (i != 0)printf(" ");printf("%d", -s[i]);}printf("\n");return 0;
}void Union(int root1, int root2)//并查集的合并两个集合, 参数是两个集合的根(某人的编号)。
{if (root1 < root2)//这里进行了优化,即按秩归并(把小集合并到大集合里,可以减少树深度)。{s[root1] += s[root2];//更新合并后的集合人数s[root2] = root1;		//小集合根指向新集合的根}else{s[root2] += s[root1];s[root1] = root2;}
}int FindRoot(int x)//并查集的查找集合的根, 参数是人的编号
{if (s[x] < 0)//小于0,找到了根return x;else//递归查找,这里也进行了优化。即路径压缩,把该圈子所有人都指向根,减少树深度。return s[x] = FindRoot(s[x]);
}


这篇关于1107. Social Clusters (30)[并查集]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445931

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

2024年6月24日-6月30日(ue独立游戏为核心)

试过重点放在独立游戏上,有个indienova独立游戏团队是全职的,由于他们干了几个月,节奏暂时跟不上,紧张焦虑了。五一时也有点自暴自弃了,实在没必要,按照自己的节奏走即可。精力和时间也有限,放在周末进行即可。除非哪天失业了,再也找不到工作了,再把重心放在独立游戏上。 另外,找到一个同样业余的美术,从头做肉鸽游戏,两周一次正式交流即可。节奏一定要放慢,不能影响正常工作生活。如果影响到了,还不如自

韩顺平0基础学java——第30天

p600-611 坦克大战! 艰难推进中 坦克大战-子弹 发射子弹 1.当发射一颗子弹后,就相当于启动一个线程 2.玩家拥有子弹对象,当按下J时,就启动发射行为(线程),让子弹不停移动,形成射击的过程。 3.面板mypanel需要不停重绘,才能出现这个效果 4.当子弹移动到面板边界时,就销毁子弹线程。   增加功能:让敌人发射子弹,且可以有多颗子弹。 1.在敌人坦克类中增加V

A bug‘s life 虫子的生活(带权并查集)

题目链接: 2492 -- A Bug's Life (poj.org) 题目描述: 思路: 带权并查集,处理方法基本与食物链(http://t.csdnimg.cn/fSnRr)相同,没什么思维创新 但是一开始WA了几次,有些细节没有注意好,还是需要静下心来,好好分析问题,需要警惕! 参考代码: //#include<bits/stdc++.h>#include<iostream

根据序列:2/1,3/2,5/3,...生成前30项打印出并求和

根据斐波那契数列 def fab(max): def fib_loop_while(max):max = maxa, b = 0, 1while max &

05-5.5.3 并查集的进一步优化

👋 Hi, I’m @Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771@qq.com 喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会

c#编程:有一个分数序列,2/1,3/2,5/3,8/5,13/8,21/13....找出数列的规律并求出其前30项的和

using System;using System.Collections.Generic;using System.Linq;using System.Text;//有一个分数序列,2/1,3/2,5/3,8/5,13/8,21/13....找出数列的规律并求出其前30项的和namespace ans1{class Program{static void Main(string[]

Gone框架介绍30 - 使用`goner/gin`提供Web服务

gone是可以高效开发Web服务的Golang依赖注入框架 github地址:https://github.com/gone-io/gone 文档地址:https://goner.fun/zh/ 使用goner/gin提供Web服务 文章目录 使用`goner/gin`提供Web服务注册相关的Goners编写Controller挂载路由路由处理函数io.Readerchan any

【Rust日报】 2019-03-30

使用rust與tensor來做臉部辨識 Read more Ocypod: 一個用Redis來備份的工作佇列 基於actix來實作,目前看起來功能還沒有 beanstalkd 之類的老牌 job queue 完整 不過效能應該是可以期待的,使用json來溝通 如果之後能直接支援 protobuff 就好了 畢竟json比protobuff慢多了 Read more sgx sdk 1.0了 In