并查集C++

并查集的原理

并查集(Union-Find Set)。可以把每个连通分量看成一个集合,该集合包含了连通分量中的所有点。这些点两两连通(连通性),而具体的连通方式无关紧要,就好比集合中的元素没有先后顺序之分(无序性),只有“属于”和“不属于”的区别(确定性)。在图中,每个点恰好属于一个连通分量,对应到集合表示中,每个元素恰好属于一个集合。换句话说,图的所有连通分量可以用若干个不相交集合来表示。

并查集的精妙之处在于用树来表示集合。例如,若包含点1,2,3,4,5,6的图有3个连通分量{1,3}、{2,5,6}、{4},则需要用3棵树来表示。这3棵树的具体形态无关紧要,只要有一棵树包含1、3两个点,一棵树包含2、5、6这3个点,还有一棵树只包含4这一个点即可。规定每棵树的根结点是这棵树所对应的集合的代表元(representative)。 ——摘自网络

意思就是并查集里的每一个连通分量都是一棵树,属的每个子节点,对应的都是这个树的根,而如果想让这两个连通分量合并我们只需要让一个的代表元,也就是这棵树的树根成为另一棵树的代表元,也就是另一棵树的树根的子节点。这样子这棵树的树根对应的代表元是另一棵树的树根这时,这两个连通分量就合并了。

并查集的操作

1.利用启发式合并

        启发式合并的基本原理是每次尝试将较小的集合填入较大的集合,每一个元素维护其所在集合的大小,这时并查集的时间复杂度为O(nlog_2n)。 ——《CCF中学生计算机程序设计·提高篇》

这是实现的代码:

通俗地讲就是:如果p[x]等于x,说明x本身就是树根,因此返回x;否则返回x的父结点p[x]所在树的树根(代表元)。 ——摘自网络

2.路径压缩技术

我们发现集合中只有代表原是有用的,所以在遍历到集合的其他点时可以让它们变成代表元。在启发式合并的基础上加上路径压缩可以在时间复杂度上进行很大的优化。此时的时间复杂度是O(na(n)), 这里的a(n)是阿克曼函数的反函数,大家可以去查一下阿克曼函数的证明,其实它是一个非原始递归函数,

Ackermann函数定义如下: 若m=0,返回n+1。

若m>0且n=0,返回Ackermann(m-1,1)。

若m>0且n>0,返回Ackermann(m-1,Ackermann(m,n-1))。 ——百度

你可以把它理解为一个不超过4的常数(很快很快),也就是find函数的时间复杂度为O(4)

这里大家可以看到和上面启发式合并的代码只有一个区别就是递归时当p_x!=x时的p_x改为了p_x=find(p_x)。也就是把路过的所有点都变成那个点的代表元,也就是那个点所对应的树根。并查集的效率非常高,在平摊意义下,find函数的时间复杂度几乎可以看成是常数(而union显然是常数时间)。

并查集的应用

并查集一般和Kruskal算法结合在一起,用于判定最小生成树,最小瓶颈生成树,最小瓶颈路,或者次小生成树等问题。实现代码如下:

int cmp(const int i, const int j) { return w[i]<w[j]; } 	//间接排序函数
int find(int x) { return p[x] == x ? x : p[x] = find(p[x]);}//并查集的find
int Kruskal() {int ans = 0;for(int i = 0; i < n; i++) p[i] = i; 		//初始化并查集for(int i = 0; i < m; i++) r[i] = i; 		//初始化边序号sort(r, r+m, cmp); //给边排序for(int i = 0; i < m; i++) {int e = r[i]; int x = find(u[e]); int y = find(v[e]); //找出当前边两个端点所在集合编号if(x != y) { ans += w[e]; p[x] = y; }	//如果在不同集合,合并}return ans;

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

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

相关文章

【ARM Cache 及 MMU 系列文章 1.3 -- 如何判断 L2 Cache 是否实现?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 CPU Configuration Register代码实现CPU Configuration Register 在 Armv9 架构中,我们可以通过arm 提供的自定义寄存器IMP_CPUCFR_EL1 来判断当前系统中是否实现了 L2 Cache, 如下所…

SpringBoot 实现 阿里云语音通知(SingleCallByTts)

目录 一、准备工作1.开通 阿里云语音服务2.申请企业资质3.创建语音通知模板&#xff0c;审核通过4.调用API接口---SingleCallByTts5.调试API接口---SingleCallByTts 二、代码实现1.导入依赖 com.aliyun:aliyun-java-sdk-dyvmsapi:3.0.22.创建工具类&#xff0c;用于发送语音通知…

我用AI绘画Stable Diffusion 一个月后,竟然能做出惊艳所有人的效果!

大家好&#xff0c;我是设计师阿威 如今要拍摄一组写真&#xff0c;需要服装、道具、灯光、场地、布景、拍摄、后期等过程。整个过程需要统一才能形成好的写真效果。现在有了AI绘图技术&#xff0c;我们可以实现通过AI绘图&#xff0c;只用计算机计算就得到一组接近真实的写真照…

什么是微前端

什么是微前端&#xff1f; 微前端 这个名词&#xff0c;第一次被提出还是在2016年底&#xff0c;那是在 ThoughtWorks Technology Radar。这个概念将微服务这个被广泛应用于服务端的技术范式扩展到前端领域。现代的前端应用的发展趋势正在变得越来越富功能化&#xff0c;富交互…

vue富文本wangeditor加@人功能(vue2 vue3都可以)

依赖 "wangeditor/editor": "^5.1.23", "wangeditor/editor-for-vue": "^5.1.12", "wangeditor/plugin-mention": "^1.0.0",RichEditor.vue <template><div style"border: 1px solid #ccc; posit…

Stable-Baseline3 x SwanLab:可视化强化学习训练

Stable Baselines3 (SB3) 是一个强化学习的开源库&#xff0c;基于 PyTorch 框架构建。它是 Stable Baselines 项目的继任者&#xff0c;旨在提供一组可靠且经过良好测试的RL算法实现&#xff0c;便于研究和应用。StableBaseline3主要被应用于机器人控制、游戏AI、自动驾驶、金…

Django DetailView视图

Django的DetailView是一个用于显示单个对象详情的视图。下面是一个使用DetailView来显示单个书籍详情的例子。 1&#xff0c;添加视图 Test/app3/views.py from django.shortcuts import render# Create your views here. from django.views.generic import ListView from .m…

BGP学习

BGP是一种矢量协议&#xff0c;使用TCP作为传输协议 ,目的端口号是179.是触发式更新&#xff0c;不是周期性更新 BGP的重点是策略路由的选路&#xff0c;能对路由进行路由汇总。运行BGP的路由器被称为BGP发言者&#xff0c;两个建立BGP会话的路由器互为对等体 IBGP和EBGP的区…

STM32项目分享:OV7670将图片上传电脑

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

调用华为API实现车牌识别

目录 1.作者介绍2.华为云车牌识别2.1车牌识别技术2.2华为云OCR 3.实验过程3.1获取API密钥3.2Python代码实现3.3实验结果 参考链接 1.作者介绍 袁明懿&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2023级研究生 研究方向&#xff1a;机器视觉与人工智能 电子…

Unity2D计算两个物体的距离

1.首先新建一个场景并添加2个物体 2.创建一个脚本并编写代码 using UnityEngine;public class text2: MonoBehaviour {public GameObject gameObject1; // 第一个物体public GameObject gameObject2; // 第二个物体void Update(){// 计算两个物体之间的距离float distance Vec…

港科夜闻 | 香港科大与香港科大(广州)合推红鸟跨校园学习计划,共享教学资源,促进港穗学生交流学习...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与香港科大(广州)合推“红鸟跨校园学习计划”&#xff0c;共享教学资源&#xff0c;促进港穗学生交流学习。香港科大与香港科大(广州)6月14日共同宣布推出“红鸟跨校园学习计划”&#xff0c;以进一步加强两校学…

【stm32】——基于I2C协议的OLED显示

目录 一、I2C通讯 二、U8G2 1.U8g2简介 2.CubexMX配置 3.移植U8g2 4.编写移植代码 三、显示汉字 四、字体滚动 五、图片显示 总结 一、I2C通讯 IIC(Inter&#xff0d;Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设…

零代码本地搭建AI大模型,详细教程!普通电脑也能流畅运行,中文回答速度快,回答质量高

这篇教程主要解决&#xff1a; 1). 有些读者朋友&#xff0c;电脑配置不高&#xff0c;比如电脑没有配置GPU显卡&#xff0c;还想在本地使用AI&#xff1b; 2). Llama3回答中文问题欠佳&#xff0c;想安装一个回答中文问题更强的AI大模型。 3). 想成为AI开发者&#xff0c;开…

智能识别技术在旧物回收系统中的优化策略

内容概要&#xff1a; 智能识别技术在旧物回收系统中的应用已经取得了显著的成效&#xff0c;但如何进一步优化其性能以提高回收效率和准确性&#xff0c;仍是我们需要探讨的问题。本文将针对智能识别技术在旧物回收系统中的优化策略进行探讨。 一、算法优化 算法是智能识别…

【好书分享第十一期】深入Rust标准库(文末送书)

文章目录 作者简介概括书籍特色知名大V推荐带来的成长受众人群内容脉络粉丝福利 作者简介 任成珺 拥有超过20年的系统级程序架构及开发经验&#xff0c;至今仍活跃在开发一线。 王晓娜 博士&#xff0c;任职于中国兵器工业集团公司北方科技信息研究所&#xff0c;善于深入浅出…

操作符详解(2)

上次我们讲了算术操作符 加减乘除取模 除号 如果你想得到整数&#xff0c;那么两边必须是整数&#xff0c;如果你想得到浮点数&#xff0c;那么你的操作数的两端必须有一个是浮点数 而取模% 两边必须是整数&#xff0c;返回的是整除后的余数 然后我们还讲了左移和右移操作…

浔川身份证号码查询——浔川python科技社

Python获取身份证信息 公民身份号码是每个公民唯一的、终身不变的身份代码&#xff0c;由公安机关按照公民身份号码国家标准编制。每一个居民只能拥有一个唯一的身份证&#xff0c;它是用于证明持有人身份的一种法定证件。 身份证包含了个人的一些重要信息&#xff0c;比如&am…

2024年哪4种编程语言最值得学习?看JetBrains报告

六个月前,编程工具界的大牛JetBrains发布了他们的全球开发者年度报告。 小吾从这份报告中挑出了关于全球程序员过去一年使用编程语言的情况和未来的采纳趋势,总结出2024年最值得学习的四种编程语言。一起来看看吧。 JetBrains在2023年中开始,就向全球的编程达人们发出了问卷…

Vue32-挂载流程

一、init阶段 生命周期本质是函数。 1-1、beforeCreate函数 注意&#xff1a; 此时vue没有_data&#xff0c;即&#xff1a;data中的数据没有收到。 1-2、create函数 二、生成虚拟DOM阶段 注意&#xff1a; 因为没有template选项&#xff0c;所以&#xff0c;整个div root都…