最小生成树(Minimum Spanning Tree)及生成MST的几种方法
最小生成树 (Minimum Spanning Tree)
最小生成树是图论领域的一个基本概念,适用于加权连通图,其中包括若干顶点(节点)以及连接这些顶点的边(边可以有权重)。在一个加权连通图中,生成树(Spanning Tree)是一个无环子图,它包含图中的所有顶点,并且用最少数量的边将它们连接起来。注意,无环是指子图中不存在任何边的闭环,最少数量的边意味着任意两个顶点之间有且仅有一条路径相互到达。
“最小生成树”这一术语的“最小”指的是在所有可能的生成树中,边的权重之和最小的那一个。在实际应用中,最小生成树可以帮助找到在网络设计、电路设计等方面成本最低的方案。
我们来举一个简单的例子。假设有四个城市,每两个城市之间可以修建道路相连,不同的道路成本不同,现在的目标是花最少的成本将这四个城市全部连通。最小生成树算法即是解决此类问题的有效工具。
生成最小生成树的算法
接下来,我们将介绍四个生成最小生成树的经典算法,它们分别是克鲁斯卡尔(Kruskal)算法和普里姆(Prim)算法,以及相对少见的Borůvka算法和Sollin算法。
1. 克鲁斯卡尔(Kruskal)算法
克鲁斯卡尔算法是基于边的贪心策略。它的基本思想是按照边权重从小到大的顺序选择边,从而构造最小生成树。选取的边必须满足添加后不形成环路。
伪代码:
KRUSKAL(G):A = ∅ // A将存储最小生成树的边对于G中的每个顶点v:MAKE-SET(v)将G中的所有边按权重由低到高排序对于每条边(u, v)按序做如下操作:if FIND-SET(u) ≠ FIND-SET(v): // 检查u和v是否在树的不同分量中A = A ∪ {(u, v)} // 将边(u, v)加入到A中UNION(u, v) // 将u和v的分量合并返回A
其中 MAKE-SET、FIND-SET 和 UNION 是不相交集合数据结构的操作,用于维护和查询顶点间是否存在环路。
2. 普里姆(Prim)算法
普里姆算法是基于点的贪心策略。在这个算法中,我们从任选的一个顶点开始构建最小生成树,逐步扩大树的范围,每一步都添加一条连接树与非树顶点且权重最小的边。
伪代码:
PRIM(G, w, r): // G是图,w是权重函数,r是开始顶点for each u ∈ G.V:u.key = ∞ // 初始化所有顶点的键值为无穷大u.π = NIL // π属性用来记录最小生成树的父节点r.key = 0Q = G.Vwhile Q ≠ ∅:u = EXTRACT-MIN(Q) // 从Q中取出键值最小的顶点ufor each v ∈ G.Adj[u]: // 遍历u的所有邻居vif v ∈ Q and w(u, v) < v.key:v.π = u // 更新v的父节点为uv.key = w(u, v) // 更新v的键值为u与v之间边的权重
在Prim算法中,EXTRACT-MIN(Q)
是优先队列的操作,它用于选择权重最小的边,而G.Adj[u]
表示图中与顶点u相邻的所有顶点集合。
3. Borůvka算法
Borůvka算法是最早的最小生成树算法之一,适用于稀疏图。算法的每个阶段为图中的每个连通分量选择一条权重最小的边,并将这些边添加到生成树中,直到图变为连通的。
伪代码:
BORUVKA(G):forest = each vertex in G is a separate treewhile there is more than one tree in the forest:for each tree T in the forest:find the smallest edge connecting T to another treeadd this edge to the forestreturn the edges added to the forest
4. Sollin算法
Sollin算法(也被称为Borůvka的改进版本)同样适用于稀疏图,其基本想法是在每个阶段找到每个连通分量键值最小的边,并将它们加入生成树,像Borůvka算法一样重复这个过程,直到所有分量合并到一起。
伪代码:
SOLLIN(G):Initialize a forest F with each vertex in G as a separate treewhile F has more than one tree dofor each tree T in the forest F dolet e = the lightest edge with one end in Tif there is no edge chosen for T or e is lighter than the already chosen edgechoose e for Tfor each edge e chosen in this round doif e connects two different trees thenadd e to the forest Freturn the forest F as the minimum spanning tree
在Sollin算法中,检查加入边e后是否会造成环路的操作通过查询树的根节点来实现,保证了每次迭代加入的边一定属于不同的连通分量。
如果你想更深入地了解人工智能的其他方面,比如机器学习、深度学习、自然语言处理等等,也可以点击这个链接,我按照如下图所示的学习路线为大家整理了100多G的学习资源,基本涵盖了人工智能学习的所有内容,包括了目前人工智能领域最新顶会论文合集和丰富详细的项目实战资料,可以帮助你入门和进阶。
链接: 人工智能交流群(大量资料)
相关文章:

最小生成树(Minimum Spanning Tree)及生成MST的几种方法
最小生成树 (Minimum Spanning Tree) 最小生成树是图论领域的一个基本概念,适用于加权连通图,其中包括若干顶点(节点)以及连接这些顶点的边(边可以有权重)。在一个加权连通图中,生成树…...

逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计
逻辑漏洞 暴力破解(DVWA靶场)与验证码安全 (pikachu靶场) 全网最详解包含代码审计 0x01 前言 在当今互联网的广袤世界中,各式交互平台层出不穷。每一个交互平台几乎都要求用户注册账号,而这些账号则成为我们在数字世界中的身份象征。账号的安全性变得至…...

io基础入门
压缩的封装 参考:https://blog.csdn.net/qq_29897369/article/details/120407125?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-120407125-blog-120163063.235v38pc_relevant_sort_base3&spm1001.2101.3001.…...

k8s ingress 无法找到端点
文章目录 ingress rule无法找到端点这个注解是什么意思呢?为何不生效呢?端点无法更新?如何确认ingressclass呢?修复端点无法发现的问题多个ingress controller 架构 ingress rule无法找到端点 在vnnox-cn集群创建ingress…...

properties转yml
目前搜索到的大部分代码都存在以下问题: 复杂结构解析丢失解析后顺序错乱 所以自己写了一个,经过不充分测试,基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外,还可以生成代码、sql转json等,可…...

谈谈中间件设计的思路
前言 想要设计和真正理解中间件的架构理论和思想。对于开发来说需要具备三个关键的能力 1:基础通用技术的深入理解和运用2:了解和熟悉常见中间件的设计思想,且有自己的感悟,并且能按照自己的理解模仿写一写3:业务的高度理解能力…...
WT2605-24SS音频蓝牙录放语音芯片:标准蓝牙功能与多样化存储播放方式助力音频体验升级
在音频技术日新月异的今天,WT2605-24SS音频蓝牙录放语音芯片以其强大的功能和出色的性能,成为了音频市场的一颗璀璨明星。该芯片不仅具备标准音频蓝牙功能,还支持蓝牙电话本、录音功能以及多种存储和播放方式,为用户提供了更加便捷…...
openssl生成ssl证书
x509证书一般会用到三类文,key,csr,crt。 Key 是私用密钥openssl格,通常是rsa算法。 Csr 是证书请求文件,用于申请证书。在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥。…...

以太网PHY,MAC接口
本文主要介绍以太网的 MAC 和 PHY,以及之间的 MII(Media Independent Interface ,媒体独立接口)和 MII 的各种衍生版本——GMII、SGMII、RMII、RGMII等。 简介 从硬件的角度看,以太网接口电路主要由MAC(M…...
c语言中 , x++ 和 ++x的区别
一 c语言中 , x 和 x的区别 x 和 x 是 C 语言中的自增运算符,它们的区别在于它们的执行时机和返回值: 1. x (后缀自增): 先使用变量的值,然后再将变量的值加 1。这意味着,如果你在一个表达式中使用了 x,那么该表达式…...

DBeaver 社区版(免费版)下载、安装、解决驱动更新出错问题
DBeaver 社区版(免费版) DBeaver有简洁版,企业版,旗舰版,社区版(免费版)。除了社区版,其他几个版本都是需要付费的,当然相对来说,功能也要更完善些ÿ…...

景联文科技加入中国人工智能产业联盟(AIIA)数据委员会
近日,景联文科技加入中国人工智能产业联盟(AIIA)数据委员会,成为委员会成员单位。 中国人工智能产业发展联盟(简称AIIA)是在国家发改委、科技部、工信部、网信办指导下,由中国信息通信研究院等单…...
数据结构 / 结构体指针
1. 格式 struct 结构体名{数据类型 成员1;数据类型 成员2; .... };struct 结构体名 *指针变量名 2. 结构体指针指向普通变量的地址 struct CAR{char name[10];int price; };struct CAR car{"byd",160}; struct CAR *p&car; //p是指向结构体变量car的指针// p…...

P1 什么是链表 C语言简单易懂
目录 前言 01 什么是链表 02 数组的特点 03 数组的缺点 3.1 删除数组其中一个元素 3.2 数组增加某个节点 04 链表 前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《 C 》✨✨✨ 🔥 推荐专栏2: 《 Linux C应用编程(概念…...

Python实现FA萤火虫优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法(Fire-fly algorithm,FA)由剑桥大学Yang于2009年提出 , …...
Spring Task
Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 **定位:**定时任务框架 **作用:**定时自动执行某段Java代码 cron表达式 cron表达式其实就是一个字符串,通过cron表达式可以定义任务触…...

HttpServletRequest/Response视频笔记
学习地址:144-尚硅谷-Servlet-HttpServletRequest类的介绍_哔哩哔哩_bilibili 目录 1.HttpServletRequest 类 a.HttpServletRequest类有什么作用 b.HttpServletRequest类的常用方法 c.如何获取请求参数 d.解决post请求中文乱码问题 获取请求的参数值相关问题 …...

网上选课系统源码(Java)
JavaWebjsp网上选课系统源码 运行示意图:...

mac修改默认shell为bash
1. 打开系统偏好设置 2. 点击用户群组 3. 按住ctrl,点击用户名 4. 点击高级选项,修改登录shell 参考:在 Mac 上将 zsh 用作默认 Shell - 官方 Apple 支持 (中国)...
基于Java SSM小区物业管理系统
小区有多栋住宅,每栋楼有多套物业(房屋),物业管理公司提供物业管理服务,业主需要按月缴纳物业费。小区物业管理系统对物业公司的日常工作进行管理。系统管理的对象及操作有: 楼宇信息:楼号、户数、物业费标准。 房屋信…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...