【算法基础3】并查集

并查集

现在我们要完成两个操作:
1.将两个集合合并
2.询问两个元素是否在一个集合当中
这两个操作的时间复杂度均为O(n),但我们使用并查集的话,可以在近乎O(1)的时间内完成这一操作。
基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号。每个节点存储它的父节点。用p[x]来表示x的父节点。
于是并查集就转换为了3个基本问题:
1.如何判断树根? if(p[x]==x)
2.如何求x在哪个集合内? while(p[x]!=x) x=p[x];
3.如何合并两个集合?把一个集合的树直接插入到另一个树的树根上。如p[x]是x的集合编号,p[y]是y的集合编号,那就令p[x]=y;
此时我们发现,最重要的查询操作的时间复杂度仍然不够理想,我们仍然需要遍历很多次,这是我们就要对并查集操作进行优化。
最常用的优化叫路径压缩,就是在向上查找到根节点之后,把路径上的所有的节点的p[x]都指向根节点,此后如果再查询集合编号,就无需多次查询,直接指向了根节点。
在路径压缩优化之后,并查集查询集合的时间复杂度就趋近于O(1)了。

模版题

AcWing836. 合并集合

#include <iostream>using namespace std;const int N=1e6+10;int n,m;
int p[N];//返回x的祖宗节点+路径压缩
int find(int x)
{if(p[x]!=x) p[x]=find(p[x]);//x如果不是根节点,就继续向上查找return p[x];
}int main()
{ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);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[0]=='M') p[find(a)]=find(b);else{if(find(a)==find(b)) puts("Yes");else puts("No");}}return 0;
}

例题1

AcWing837. 连通块中点的数量

#include <iostream>using namespace std;const int N=1e6+10;int n,m;
int p[N],siz[N];//size记录每个点所在集合的元素个数//返回x的祖宗节点
int find(int x)
{if(p[x]!=x) p[x]=find(p[x]);//x如果不是根节点,就继续向上查找return p[x];
}int main()
{cin>>n>>m;for(int i=1;i<=n;i++){p[i]=i;//初始情况下节点离散,根节点就是自己siz[i]=1;//集合内只有自己}while(m--){string op;int a,b;cin>>op;if(op=="C"){cin>>a>>b;if(find(a)!=find(b)){siz[find(b)]+=siz[find(a)];//※参见注释p[find(a)]=find(b);}}else if(op=="Q1"){cin>>a>>b;if(find(a)==find(b)) puts("Yes");else puts("No");}else{cin>>a;cout<<siz[find(a)]<<endl;}}return 0;
}

※连通块大小的加和需要在操作集合之前,否则先操作集合会使连通块大小改变。要避免这一问题,可以选择先将两个集合的大小取出来再做这些操作,如:

if(op=="C"){cin>>a>>b;a=find(a),b=find(b);if(a!=b){p[a]=b;siz[b]+=siz[a];}}

此外,数组起名为size[]可能会与C++的关键字冲突,故这里命名为siz。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/823793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麻将的玩法及技巧

麻将是一种古老而受欢迎的博弈游戏&#xff0c;其玩法和技巧多种多样&#xff0c;因地区和玩家习惯的不同而有所差异。以下是一些通用的麻将玩法和技巧&#xff1a; 一、玩法 洗牌与码牌&#xff1a;玩家双手搓动牌&#xff0c;使牌均匀而无序地运动&#xff0c;称为“洗牌”。…

Hive:正则regexp_extract函数

语法: regexp_extract(string subject, string pattern, int index) 返回值: string 说明&#xff1a; 将字符串subject按照pattern正则表达式的规则拆分&#xff0c;返回index指定的字符。 第一参数&#xff1a; 要处理的字段 第二参数: 需要匹配的正则表达式 第三个参数: …

Java处理CSV类库:OpenCSV

一&#xff1a;CSV简介 Comma-Separated Values(CSV), 因分隔符没有严格指定规范标准&#xff0c;可以使用逗号&#xff0c;也可以使用其他字符&#xff08;如制表符\t、分号;等&#xff09;&#xff0c;所以CSV也称为 逗号分隔值或者字符分隔值。csv文件是使用纯文本来存储表…

【学习笔记】耳分解与无向图的双连通性

感觉之前对于这方面的理解还是不够深入。 1.1 1.1 1.1 在无向图 G ( V , E ) G(V,E) G(V,E)中&#xff0c;有一个子图 G ′ ( V ′ , E ′ ) G(V,E) G′(V′,E′)&#xff08;不一定是导出子图&#xff0c;其实只看 V ′ V V′就好了&#xff09;&#xff0c;若简单路径或简单…

R、Python的Copula变量相关性分析及AI大模型应用

在工程、水文和金融等各学科的研究中&#xff0c;总是会遇到很多变量&#xff0c;研究这些相互纠缠的变量间的相关关系是各学科的研究的重点。虽然皮尔逊相关、秩相关等相关系数提供了变量间相关关系的粗略结果&#xff0c;但这些系数都存在着无法克服的困难。例如&#xff0c;…

leetcode748-Shortest Completing Word

题目 给你一个字符串 licensePlate 和一个字符串数组 words &#xff0c;请你找出 words 中的 最短补全词 。 补全词 是一个包含 licensePlate 中所有字母的单词。忽略 licensePlate 中的 数字和空格 。不区分大小写。如果某个字母在 licensePlate 中出现不止一次&#xff0c…

MSSQL 命令行操作说明 sql server 2022 命令行下进行配置管理

说明&#xff1a;本文的内容是因为我在导入Access2019的 *.accdb 格式的数据时&#xff0c;总是出错的背景下&#xff0c;不得已搜索和整理了一下&#xff0c;如何用命令行进行sql server 数据库和用户管理的方法&#xff0c;作为从Access2019 直接导出数据到sql server 数据库…

linux限权

shell命令以及运行原理 什么是shell命令&#xff1a; 将使用者的命令翻译给核心&#xff08;kernel&#xff09;处理。同时&#xff0c;将核心的处理结果翻译给使用者。 shell就相当于操作系统外的一层外壳 其实就是登录linux时的一个可执行程序&#xff08;进程&#xff09…

滴滴春招深度揭秘:2024最全Spring Microservices Architecture面试题大全,每位开发者必备!99%的应聘者都强烈推荐!

在2024年&#xff0c;随着技术的不断演进和市场需求的快速变化&#xff0c;微服务架构已经成为现代软件开发的核心。滴滴作为领先的科技公司之一&#xff0c;特别重视在其庞大的交通网络服务平台中采用微服务架构&#xff0c;以提高系统的可扩展性、灵活性和维护性。微服务架构…

安装kali虚拟机

第一步&#xff1a;安装vmware 安装到最后&#xff0c;会提示输入序列号 安装成功后的图标 第二步&#xff1a;创建一个虚拟主机 创建了一个虚拟机 第三步&#xff1a;给虚拟机安装系统 安装系统&#xff0c;都必须有 系统镜像文件 一般系统镜像文件的后缀是 .iso 第一步&a…

利用CNN-Bigru-Attention模型输电线路故障诊断(Python代码,TensorFlow框架,)

效果视频&#xff1a;利用CNN-Bigru-Attention模型输电线路故障诊断(Python代码&#xff0c;TensorFlow框架&#xff0c;压缩包带有数据集和代码&#xff0c;解压缩可直接运行)_哔哩哔哩_bilibili 售后包免费远程协助运行&#xff08;用向日葵或者todesk软件协助&#xff09; …

Java中如何生成PDF文件的缩略图

在Java中生成PDF文件的缩略图可以使用Apache PDFBox库。以下是一个简单的示例代码来实现这个功能&#xff1a; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.tools.imageio.ImageIOUtil;import j…

主机连接本地VM虚拟机中的Ubuntu系统

虽然说本文特指Ubuntu系统&#xff0c;但过程原理也可以运用到类似的虚拟机上 前言 假设本机IPV4地址为10.26.231.99 1. 查看主机IP winr → 输入cmd → 点击确定&#xff0c;打开CMD → 输入ipconfig查看本地IPV4地址&#xff08;记下来&#xff09; 2. 虚拟机添加自动桥…

GoogleNet网络训练集和测试集搭建

测试集和训练集都是在之前搭建好的基础上进行修改的&#xff0c;重点记录与之前不同的代码。 还是使用的花分类的数据集进行训练和测试的。 一、训练集 1、搭建网络 设置参数&#xff1a;使用辅助分类器&#xff0c;采用权重初始化 net GoogleNet(num_classes5, aux_logi…

Midjourney常见玩法及prompt关键词技巧

今天系统给大家讲讲Midjourney的常见玩法和prompt关键词的一些注意事项&#xff0c;带大家入门&#xff5e;&#xff08;多图预警&#xff0c;建议收藏&#xff5e;&#xff09; 一、入门及常见玩法 1、注册并添加服务器&#xff08;会的童鞋可跳过&#xff5e;&#xff09; …

实在智能携AI Agent智能体亮相2024年度QCon全球软件开发大会

4月11日-13日&#xff0c;以“全面进化”作为2024年度主题的「QCon全球软件开发大会暨智能软件开发生态展」在北京隆重举行。作为AI准独角兽和超自动化头部企业&#xff0c;实在智能应邀出席发表《面向办公自动化领域的AI Agent建设思考与分享》演讲及圆桌交流&#xff0c;展示…

反转二叉树(力扣226)

解题思路&#xff1a;用队列进行前序遍历的同时把节点的左节点和右节点交换 具体代码如下&#xff1a; class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root NULL) return root;swap(root->left, root->right); // 中invertTree(root->left)…

OpenHarmony南向开发案例【智慧中控面板(基于 Bearpi-Micro)】

1 开发环境搭建 【从0开始搭建开发环境】【快速搭建开发环境】 参考鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或复制转到。 【注意】&#xff1a;快速上手教程第六步出拉取代码时需要修改代码仓库地址 在MobaXterm中输入…

【模拟】Leetcode 提莫攻击

题目讲解 495. 提莫攻击 算法讲解 前后的两个数字之间的关系要么是相减之差 > 中毒时间 &#xff0c;要么反之 那即可通过示例&#xff0c;进行算法的模拟&#xff0c;得出上图的计算公式 class Solution { public:int findPoisonedDuration(vector<int>& time…

redis热key问题如何解决?

今天跟大家分享一个干货——redis热key问题 那么什么是redis热key呢&#xff1f; 在Redis中&#xff0c;热键问题是指那些经常被访问的键&#xff0c;它们会消耗大量的Redis服务器资源&#xff0c;当大量的请求集中在一个key上&#xff0c;会导致这个节点的cpu&#xff0c;内…