当前位置: 首页 > news >正文

【数据结构】并查集

目录

一:用途

二:实现    O(1)

三:例题

例题1:集合

例题2:连通图无向

例题3:acwing 240 食物链


 

一:用途

  1. 将两个集合合并
  2. 询问两个元素是否在一个集合当中

二:实现    O(1)

每个集合用一棵树表示,树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点。

  1. 问题一:如何判断树根:if(p[x]==x)
  2. 问题二:如何求x的集合编码:while(p[x]!=x)       x=p[x];
  3. 问题三:如何合并两个集合:px是x的集合编码,py是y的集合编码。p[x]=y      //直接将树y插到树x上作为子树。
(1)朴素并查集:int p[N]; //存储每个点的祖宗节点// 返回x的祖宗节点int find(int x){if (p[x] != x) p[x] = find(p[x]);return p[x];}// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ) p[i] = i;// 合并a和b所在的两个集合:p[find(a)] = find(b);(2)维护size的并查集:   //需要求集合点的数量int p[N], size[N];//p[]存储每个点的祖宗节点, size[]只有祖宗节点的有意义,表示祖宗节点所在集合中的点的数量// 返回x的祖宗节点int find(int x)// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ){p[i] = i;    size[i] = 1;}// 合并a和b所在的两个集合:size[find(b)] += size[find(a)];p[find(a)] = find(b);(3)维护到祖宗节点距离的并查集:int p[N], d[N];//p[]存储每个点的祖宗节点, d[x]存储x到p[x]的距离// 返回x的祖宗节点int find(int x){if (p[x] != x){int u = find(p[x]);d[x] += d[p[x]];p[x] = u;}return p[x];}// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ){p[i] = i;d[i] = 0;}// 合并a和b所在的两个集合:p[find(a)] = find(b);d[find(a)] = distance; // 根据具体问题,初始化find(a)的偏移量

三:例题

例题1:集合

一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。

现在要进行 m 个操作,操作共有两种:

M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;
输入格式

第一行输入整数 n 和 m。

接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。

输出格式

对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b 在同一集合内,则输出 Yes,否则输出 No。

每个结果占一行。

数据范围

1≤n,m≤1e5

输入样例:

4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4

 输出样例:

Yes
No
Yes

 

#include<iostream>using namespace std;const int N = 100010;int n, m;
int p[N];    //存储父节点int find(int x)     // 返回x的祖宗节点
{if(p[x] != x) p[x] = find(p[x]);return p[x];
}int main()
{cin >> n >> m;for(int i = 1; i <= n; i++) p[i] = i;      //初始化while(m--){char op[2];int a, b;cin >> op >> a >> b;if(*op == 'M') p[find(a)] = find(b);    //合并a和belse {if(find(a) == find(b)) cout << "Yes" << endl;else cout << "No" << endl;}}return 0;
}

例题2:连通图无向

给定一个包含 n 个点(编号为 1∼n1∼n)的无向图,初始时图中没有边。

现在要进行 m 个操作,操作共有三种:

C a b,在点 a 和点 b 之间连一条边,aa 和 b 可能相等;
Q1 a b,询问点 a 和点 b 是否在同一个连通块中,a 和 b可能相等;
Q2 a,询问点 a所在连通块中点的数量;
输入格式

第一行输入整数 n 和 m。

接下来 m行,每行包含一个操作指令,指令为 C a b,Q1 a b 或 Q2 a 中的一种。

输出格式

对于每个询问指令 Q1 a b,如果 aa 和 bb 在同一个连通块中,则输出 Yes,否则输出 No。

对于每个询问指令 Q2 a,输出一个整数表示点 a 所在连通块中点的数量

每个结果占一行。

数据范围

1≤n,m≤1051≤n,m≤105

输入样例:

5 5
C 1 2
Q1 1 2
Q2 1
C 2 5
Q2 5


输出样例:

Yes
2
3
#include<iostream>
using namespace std;
const int N=1e5+10;
int n,m,p[N],sizee[N];
//p[]存储每个点 sizee[]存储根节点所拥有的子节点数
//并查集中的find函数
int find(int x)
{if(p[x]!=x) p[x]=find(p[x]);return p[x];
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) {p[i]=i;sizee[i]=1;//每个节点作为根节点 集合中只有自己一个元素}while(m--){char op[3];int a,b;scanf("%s",op);if(op[0]=='C')//连边,就是合并{scanf("%d%d",&a,&b);if(find(a)==find(b)) continue;//在一个集合里 就跳出sizee[find(b)]+=sizee[find(a)];//将节点数加到新根节点数上//例如原来a连通块里有3个节点 b里面有4个节点//a连到b的连通块里 那么b里面现在有7个节点p[find(a)]=find(b);//根节点等于b的根节点}else if(op[1]=='1'){scanf("%d%d",&a,&b);if(find(a)==find(b)) puts("Yes");//在同一个集合else puts("No");}else{scanf("%d",&a);printf("%d\n",sizee[find(a)]);//输出根节点的数}}return 0;	
} 

例题3:acwing 240 食物链

相关文章:

【数据结构】并查集

目录 一&#xff1a;用途 二&#xff1a;实现 O(1) 三&#xff1a;例题 例题1&#xff1a;集合 例题2&#xff1a;连通图无向 例题3&#xff1a;acwing 240 食物链 一&#xff1a;用途 将两个集合合并询问两个元素是否在一个集合当中 二&#xff1a;实现 O(1) 每…...

软考--网络攻击分类

网络攻击的主要手段包括口令入侵、放置特洛伊木马程序、拒绝服务&#xff08;DoS)攻击、端口扫描、网络监听、欺骗攻击和电子邮件攻击等。口令入侵是指使用某些合法用户的账号和口令登录到目的主机&#xff0c;然后再实施攻击活动。特洛伊木马&#xff08;Trojans)程序常被伪装…...

蓝桥杯刷题冲刺 | 倒计时17天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.长草2.分考场1.长草 题目 链接&#xff1a; 长草 - 蓝桥云课 (lanqiao.cn) 题目描述 小明有一…...

冲击蓝桥杯-并查集,前缀和,字符串

目录 前言 一、并查集 1、并查集的合并&#xff08;带路径压缩&#xff09; 2、询问是否为同一个集合 3、例题 二、前缀和 1 、前缀和是什么 2、经典题目 三- 字符串处理 1、字符串的插入 2、字符串转化为int类型 3、字符反转 前言 并查集合前缀&#xff0c;字符串…...

【matlab学习笔记】线性方程组求解方法

线性方程组求解方法2.1 求逆法实现方式例子2.2 分解法LU分解&#xff08;Doolittle分解&#xff09;实现方法例子QR分解法实现方法例子Cholesky 分解法实现方法例子奇异值分解法实现方法例子Hessenberg 分解实现方法例子Schur 分解实现方法例子2.3 迭代法逐次迭代法里查森迭代法…...

Python带你一键下载到最新章节,不付费也能看

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 完整源码、素材皆可点击文章下方名片获取此处跳转 开发环境: python 3.8 运行代码 pycharm 2022.3 辅助敲代码 requests 发送请求/第三方模块 模块安装&#xff1a;win R 输入cmd 输入安装命令 pip install 模块名 如果…...

【sentinel】熔断降级规则详解及源码分析

概述 除了流量控制以外&#xff0c;对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块&#xff0c;可能是另外的一个远程服务、数据库&#xff0c;或者第三方API等。例如&#xff0c;支付的时候&#xff0c;可能需要远程调用银联…...

ffplay源码分析-main函数入口分析

ffplay源码分析-main函数入口分析 基于ffmpeg6.0源码分析。 流程 使用ffplay播放视频文件&#xff0c;会触发main函数的调用。main函数中会进行以下操作&#xff1a; 从命令行中解析日志级别、日志是否需要落文件、是否要输出banner信息。banner信息包含版权、库的版本。注…...

C++三种继承方式

C继承的一般语法为&#xff1a;class 派生类名:&#xff3b;继承方式&#xff3d; 基类名{派生类新增加的成员};继承方式限定了基类成员在派生类中的访问权限&#xff0c;包括 public&#xff08;公有的&#xff09;、private&#xff08;私有的&#xff09;和 protected&#…...

【Android -- 软技能】《软技能:代码之外的生存指南》之好书推荐(一)

前言 这是一本由美国的一个软件开发人员写的&#xff0c;但书中除了有 Java 、C# 几个单词外&#xff0c;没有一行代码。 因为这本书讲的是代码之外的东西。 文章目录结构&#xff1a; 1. 职业 从业心态&#xff1a;说白了就是要有责任心&#xff0c;把每份工作要当成是自…...

Nginx可视化管理工具 - Nginx Proxy Manager

一、介绍 nginx-proxy-manager 是一个反向代理管理系统,它基于Nginx,具有漂亮干净的 Web UI。还可以获得受信任的 SSL 证书,并通过单独的配置、自定义和入侵保护来管理多个代理。 其官网地址如下: https://nginxproxymanager.com/ 二、安装 第一步:192.168.1.108服务…...

https是如何保证安全的

在学习http与https的区别的时候&#xff0c;我们通常从以下几点出发&#xff1a;http是超文本传输协议&#xff0c;是明文传输&#xff0c;有安全风险&#xff0c;https在TCP和http网络层之间加入了SSL/TLS安全协议&#xff0c;使得报文能够加密传输http连接简单&#xff0c;三…...

ubuntu下使用GCC开发单片机的过程

以下是一个简单的单片机C程序示例,实现的功能是控制LED灯的闪烁: #include <reg52.h> // 导入单片机的寄存器定义void main() {while(1) { // 无限循环P1 = 0x00; // P1口输出低电平delay(1000); // 延时1秒P1 = 0xff; // P1口输出高电平delay(1000); // 延时1秒…...

人工智能能否取代软硬件开发工程师

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 人工智能发展趋势 随着AI技术的不断发展&#xff0c;它正在改变我们的生活方式、商业模式和工作方式。人工智能技术的发展一直处于快速变化和持续创新的状态&#xff0c;以下…...

BPI-R3开发板 - uboot编译

一. 获取源码 https://github.com/mtk-openwrt/u-boot 二. 编译步骤 编译环境为ubuntu 18.04。交叉编译工具链我用的是openwrt编译生成的工具链&#xff0c;并设置到环境变量&#xff0c;如下&#xff1a; export PATH$PATH:/root/mt8976/BPI-R3-OPENWRT-V21.02.3-main/staging…...

优秀程序员的5个特征,你在第几层?

每个人程序员都对未来的职业发展有着憧憬和规划&#xff0c;要做架构师、要做技术总监、要做CTO。但现实总是复杂的&#xff0c;日复一日的工作与生活总能让人一次又一次地陷入迷茫。大部分原因就是对职业发展轨迹和自我能力提升的一般规律缺乏认识&#xff0c;做事找不到方向或…...

JAVA Session会话 Thymeleaf - 视图模板技术配置步骤

JAVAWebSession会话会话跟踪技术session保存作用域Thymeleaf - 视图模板技术配置过程Session会话 HTTP是无状态的&#xff1a;服务器无法区分这两个请求是同一个客户端发过来的&#xff0c;还是不同的客户端发过来的 现实问题&#xff1a;第一次请求是添加商品到购物车&#x…...

Linux编译cpprestsdk库

本文用的Linux系统为Ubuntu22.04&#xff0c;自带GCC11.3.0。 依赖 ①编译需要boost库&#xff0c;本文用的库版本为boost-1.82.0.beta1.tar.gz。 ②编译需要openssl库&#xff0c;这里使用的版本为openssl-1.1.1s.tar.gz。 ③编译需要cmake库&#xff0c;本文使用的是cmake-3…...

算法的时间复杂度和空间复杂度

目录 1 如何衡量一个算法的好坏 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见代码举例 2.3.1 Func2 O(N) 2.3.2 Func3 O(MN) 2.3.3 Func4 O(1) 2.3.4 Func5 strchr O(N) 2.3.5 Func6 冒泡排序 O(N^2) 2.3.6 Func7 二分…...

基本认识vue3

一、基本搭建 项目搭建 使用 最新的 Vue3 TS Vite项目 执行命令 &#xff08;本项目采用如下方式&#xff09; npm create vitelatest my-vite-app --template vue-ts或者 运行项目 npm install npm run dev项目搭建初始化目录 新搭建的项目可能会遇到个问题&#xf…...

HTTP/HTTPS协议认识

写在前面 这个博客我们要要讨论的是协议,主要是应用层.今天我们将正式认识HTTP和HTTPS,也要认识序列化和反序列化,内容比较多,但是不难 再谈协议 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层,我们要完成下面三个步骤. sock的使用 定制…...

【VScode】远程连接Linux

目录标题1. 安装扩展插件2. 在Linux上操作3. 确定Linux的IP地址4. 远程连接到Linux5. 实现免密码登录使用 VScode 远程编程与调试的时有会用到插件 Remote Development&#xff0c;使用这个插件可以在很多情况下代替 vim 直接远程修改与调试服务器上的代码&#xff0c;同时具备…...

QT/C++调试技巧:内存泄漏检测

文章目录内存泄漏方案一方案二&#xff1a;CRT调试定位代码位置方法1方法2其它问题方案三&#xff1a;使用vs诊断工具方案四&#xff1a;使用工具VLD&#xff08;Visio Leak Detector&#xff09;方案五Cppcheck内存泄漏 内存泄漏&#xff1a;指的是在程序里动态申请的内存在使…...

【贪心算法】一文让你学会“贪心”(贪心算法详解及经典案例)

文章目录前言如何理解“贪心算法”&#xff1f;贪心算法实战分析1.分糖果2.钱币找零3.区间覆盖内容小结最后说一句&#x1f431;‍&#x1f409;作者简介&#xff1a;大家好&#xff0c;我是黑洞晓威&#xff0c;一名大二学生&#xff0c;希望和大家一起进步。 &#x1f47f;本…...

【字体图标iconfont】字体图标部署流程+项目源码分析

今日&#xff0c;心情甚是烦闷&#xff0c;原由… 公司项目需要将字体图标做一些细微的调整&#xff0c;我一人分析了许久&#xff0c;看不大懂源码的逻辑&#xff0c;产生了自我怀疑。深吸一口气&#xff0c;重新鼓起勇气&#xff0c;调整心境&#xff0c;一下子豁然开朗&…...

2023最全的Web自动化测试介绍(建议收藏)

做测试的同学们都了解&#xff0c;做Web自动化&#xff0c;我们主要用Selenium或者是QTP。 有的人可能就会说&#xff0c;我没这个Java基础&#xff0c;没有Selenium基础&#xff0c;能行吗&#xff1f;测试虽然属于计算机行业&#xff0c;但其实并不需要太深入的编程知识&…...

jvm_根节点枚举安全点安全区域

1、可达性分析可以分成两个阶段 根节点枚举 从根节点开始遍历对象图 前文我们在介绍垃圾收集算法的时候&#xff0c;简单提到过&#xff1a;标记-整理算法(Mark-Compact)中的移动存活对象操作是一种极为负重的操作&#xff0c;必须全程暂停用户应用程序才能进行&#xff0c;像这…...

fabric(token-erc-20链码部署)

确保自己已经安装了fabric。没有安装的可以参考我之前的教程fabric中bootstrap.sh到底帮助我们干了什么&#xff1f;&#xff08;手动执行相关操作安装fabric2.4&#xff09;_./bootstrap.sh_小小小小关同学的博客-CSDN博客小伙伴们在跟着官方示例来安装fabric的时候都是相当烦…...

C语言基础——流程控制语句

文章目录一、流程控制语句 -- 控制程序的运行过程 9条&#xff08;一&#xff09;、条件选择流程控制语句&#xff1a;if语句if……else……语句if……else if……语句switch语句&#xff08;二&#xff09;、循环流程控制语句&#xff1a;for语句while语句do while……语句co…...

WinForm | C# 界面弹出消息通知栏 (仿Win10系统通知栏)

ApeForms 弹出消息通知栏功能 文章目录ApeForms 弹出消息通知栏功能前言全局API通知栏起始方向通知排列方向通知栏之间的间隔距离无鼠标悬停时的不透明度消息通知窗体的默认大小示例代码文本消息提示栏文本消息提示栏&#xff08;带选项&#xff09;图文消息提示栏图文消息提示…...

前端开发框架有哪些/苏州网站seo服务

dim current_dir as string Dim v_File New StreamReader(current_dir)Dim all_info As Stringall_info v_File.ReadToEnd()v_File.Close()v_File Nothing转载于:https://www.cnblogs.com/goodspeed-fish/archive/2013/05/21/3091728.html...

如何在百度开个网站/郑州网站推广方案

Spark开源框架精彩学习资源分享——DT大数据梦工厂王家林知识类&#xff1a;https://github.com/JerryLead/SparkInternals&#xff08;https://github.com/JerryLead/SparkLearning&#xff09; https://github.com/databricks/spark-knowledgebase https://github.com/knoldu…...

ps做购物小网站/整合营销理论

注&#xff1a;我在开源中国的博客不用了&#xff0c;对开源中国的技术支持丧失信心了&#xff0c;开始转投segmentfault了此为原文&#xff0c;转载请注明出处&#xff1a;https://segmentfault.com/a/11... redis有很多小功能&#xff0c;但是很实用。我们来介绍几个。 慢查询…...

南阳移动端网站制作/最新app推广

k-means聚类算法原理简介概要算法思想算法流程图解代码实现算法优化代价函数&#xff08;Distortion function&#xff09;如何选取k值聚类中心的初始化概要 K-means算法是最普及的聚类算法&#xff0c;也是一个比较简单的聚类算法&#xff0c;所以刚接触的同学不要感到害怕。…...

合肥做网站优化/做推广app赚钱的项目

有时因为病毒修改或人为删除了某个系统文件,造成系统无法正常运行的时候, 如果知道被修改或丢失的文件的文件名,我们就可以试着用光盘来修复,但是修复的时间很长,我们可以直接用expand命令来提取所需要的那个文件. 其用法如下: EXPAND [-r] Source DestinationEXPAND -r Source…...

wordpress调用最新文章模板/哪里有专业的培训机构

在抖音&#xff0c;剪辑解说9.6分热门神剧《权游》的抖主&#xff0c;仅依靠流量费月收入过万&#xff0c;积累一定量粉丝后接推广的每集平均收费6500。。。有句话说得好&#xff0c;机会留给有准备的人&#xff1b;投资什么&#xff0c;都不如投资好自己。学习1-3个月就能碾压…...