图的最小生成树——Prim算法和Kruskal算法

图的最小生成树之Prim算法及Kruskal算法 最小生成树 定义:无向图连通图G中,由所有顶点构成且总价值(连接权值和)最低的一棵树(拓扑结构)称为一个最小生成树。 最小生成树顶点为|V|个,边数为|V|-1,没有圈。 对任一生成树T,如果将图中一条不属于T的边添加至T,则会产生一个圈,从该圈中除去任意一条边,则会又恢复成生成树。 下图为一示例: 对于上面的无向有权连通图,其最小生成树为: 解决最小生成树问题有两种算法Prim算法和... 阅读详情

专栏导读及目录https://blog.youkuaiyun.com/createprogram/article/details/86741044

图的最小生成树——Prim(普里姆)算法和Kruskal(卡鲁斯卡尔)算法

(1)最小生成树的概念

通常如果确定一个问题是最小生成树问题,那么你需要构建这样一个带权图:

  1. 保证构建的图是连通图。
  2. 图中所有边权值之和最小。
  3. 为了使权值之和最小,因此图中不存在环。

最小生成树的定义

如果图G=(V,E)是一个连通的无向图,则把他的全部顶点V和一部分边E’构成一个子图G’,即G’=(V,E’),且边集E’能将图中所有顶点连通又不形成回路,则称子图G’是图G的一颗生成树。同一个图可以有不同的生成树,但可以证明:n个顶点的连通图的生成树必定含有n-1条边。对于加权连通图(连通网),生成树的权即为生成树中的所有边上的权值总和,权值最小的生成树称为图的最小生成树。

(2)最小生成树算法框架

知识准备

  1. 每一个顶点的无向连通图至少n-1条边。
  2. 设G=(V,E)是至少包含一个环路的连通图,边(I,j)至少出现在一个环路中,则图G1=(V,E-{(I,j)})也是连通图。

根据以上说明,如果在已有的图中(前提是连通图),选择n-1条不构成环的边,就可以建立一棵生成树。那么如何保证权值总和最小?下面提供两种贪心算法。

Prim算法

算法基本思想(设图G的度为n,G=(V,E))

1.设置一个顶点的集合S和一个边的集合TE,S和TE初始状态均为空集;

2.选定图中的一个顶点K,从K开始生成最小生成树,将K加入到集合S中;

3.重复下列操作,直到选取了n-1条边:

选取一条权值最小的边(x,y),其中x∈S,not(y∈S);

将顶点y加入集合S,边(x,y)加入集合TE;

4.得到最小生成树T=(S,TE)

 

Kruskal算法

算法基本思想(设图G的度为n,G=(V,E))

设最小生成树为T=(V,TE),设置边的集合TE的初始状态为空集。将图G中的边按权值从小到大排好序,然后从小的开始依次选取,若选取的边使生成树T不形成回路,则把它并入TE中保留作为T的一条边;若选取的边使生成树形成回路,则将其舍弃;如此进行下去,直到TE中包含n-1条边为止。最后T即为最小生成树。

Kruskal算法在实现过程中的关键和难点在于:如何判断欲加入的一条边是否与生成树中已保留的边形成回路。我们可以将顶点划分到不同的集合中,每个集合中的顶点表示一个无回路的连通分量,很明显算法开始时,把n个顶点划分到n个集合中,每个集合中只有一个顶点,表示顶点之间互不相通。当选取一条边时,若它的两个顶点分属于不同的集合,则表明此边连通了两个不同的连通分量,因每个连通分量无回路,所以连通后得到的连通分量任不会产生回路,因此这条边应该保留,且把它们作为一个连通分量,即把它的两个顶点所在集合合并成一个集合。反之则应该舍弃选中的那条边。

(这里可能需要图的存储相关知识 见上一篇https://blog.youkuaiyun.com/createprogram/article/details/86765606)

 

有关最小生成树的例题https://blog.youkuaiyun.com/createprogram/article/details/87126446

图的广度遍历、深度遍历及最小生成树书算法(Prim、Kruskal) 一.DFS(深度优先遍历)        深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为 阅读详情

相关推荐

图的最小生成树算法: Prim算法和Kruskal算法(C++)

本文介绍图论中最小生成树算法, 包含Prim算法和Kruskal算法. 通过代码和图解希望能帮助读者理解.

一些C++相关的技术笔记或者教程. 1306

图的最小生成树(Prim算法、Kruskal算法)

目录一、最小生成树1.1 定义1.2 性质二、Prim算法2.1 基本思想2.2 算法思想2.3 算法实现三、Kruskal算法3.1 基本思想3.2 算法思想3.3 算法实现示意图: 说明:

狂放不羁霸的博客 3404

Windows11 下 Detectron2 的安装与配置全攻略

本文提供了在Windows11系统下安装和配置Detectron2的完整教程。详细介绍了从环境准备、创建虚拟环境、安装PyTorch与CUDA,到修改源码、编译安装以及运行验证Demo的全过程,帮助开发者克服Windows平台上的常见问题,成功部署这一强大的计算机视觉库。

weixin_29081703的博客 245

算法设计-贪心算法——最小生成树Prim和Kruskal算法

算法介绍 贪心算法: 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。即通过每次贪最优的情况,直到问题结束,是通过局部最优达到整体最优的解决问题的方法。 问题实例 问题描述: 连通带权图G=(V,E) 其中V={1,2,3,4,5,6},E为10条边的集合,如上图。 请编程求解该图G的一棵最小生成树 分别使用Prim算法和Kruskal算法解决该问题 (一)Prim算法 贪心策略:每次选择到下一顶点权值最小的边 伪代码: ①将所有顶点放入集合V{}中,设最小生成树顶点集S{}

weixin_44034024的博客 4030

告别双导航栏!微信小程序web-view嵌入H5的导航栏隐藏实战(附uniapp代码)

本文详细解析了微信小程序中web-view嵌入H5页面时出现的双导航栏问题,并提供了基于uniapp的完整解决方案。通过环境感知、动态适配和样式隔离等技术手段,实现导航栏的无缝整合,提升用户体验和屏幕空间利用率。文章包含实战代码示例和常见问题排查指南,帮助开发者快速解决这一常见痛点。

weixin_26945061的博客 343

《UE4游戏开发》之 《音效系统的实现》

音效系统需要负责管理什么事情: 1.1 确定声音控制的分类:如背景音乐、技能音效、界面音效、角色配音等,不同游戏对声音有不同的分类 1.2 控制每个分类的声音的开启与关闭,以及调节每个分类声音的大小 解决如何分类: 2.1 首先需要知道ue4为声音分类提供了什么:SoundClass通常需要一个根分类【SC_RPG_Master】,便于总体控制音效,以及指定引擎默认启动的音效 打开SoundClass资产【SC_RPG_Master】,对根控制的设置,将逐级传递并按比例进行设置,以此达到控制一类声音的目的.

qq_21919621的博客 2126

最小生成树(Prim算法和Kruskal算法)

最小生成树(Prim算法和Kruskal算法) 一、Prim算法 算法思路: 首先就是从图中的一个起点a开始,把a加入U集合,然后,寻找从与a有关联的边中,权重最小的那条边并且该边的终点b在顶点集合:(V-U)中,我们也把b加入到集合U中,并且输出边(a,b)的信息,这样我们的集合U就有:{a,b},然后,我们寻找与a关联和b关联的边中,权重最小的那条边并且该边的终点在集合:(V-U)中,我们把c加入到集合U中,并且输出对应的那条边的信息,这样我们的集合U就有:{a,b,c}这三个元素了,一次类推,直到所有

dzdz123的博客 1904

汇川伺服Modbus-RTU通讯实战:从帧结构解析到西门子PLC配置

本文详细解析了汇川伺服与西门子PLC通过Modbus-RTU协议进行通讯的实战步骤,包括帧结构解析、硬件连接、参数设置及PLC程序配置。通过具体案例和常见问题排查指南,帮助工程师快速掌握工业自动化中的通讯技术,提升设备调试效率。

weixin_33670713的博客 453

最小生成树:克鲁斯卡尔(Kruskal)和普里姆(Prim)

1 前言: 一般来说,最小生成树算法以克鲁斯卡尔(Kruskal)和普里姆(Prim)较为经典。最小生成树是什么呢?举个例子,对于无向图来说,如果2个顶点如果要实现互相连通,至少需要1条边;3个顶点要互相连通,至少需要2条边;n个顶点如果需要互相连通,至少需要n-1条边。如果n个顶点有n条边,那一定有一个环存在。生成树就是无环图。 2 :克鲁斯卡尔(Kruskal) 算法思想...

zhuhuigege的博客 1847

掌握SiOME:从零构建OPC UA信息模型的完整指南

本文是掌握SiOME工具的完整指南,详细介绍了如何利用这款免费且强大的OPC UA建模工具,从零开始构建信息模型。内容涵盖从获取软件、创建命名空间、定义对象类型与变量,到添加方法、生成XML文件,并最终将其集成到开源的open62541服务器中。通过可视化建模,开发者可以高效、准确地设计复杂模型,大幅提升工业物联网与自动化项目的开发效率。

tcp8optimizer的博客 515

【物联网】基于LORA组网的远程环境监测系统设计(ThingsCloud云平台版)_资料编号34

实现一主多从的LORA组网远程通信,主机和两个从机都配备了STM32F103单片机与 LoRa 模块,主机作为中心设备及WIFI网关,负责接收和发送数据到远程物联网平台和手机APP,两个从机则负责采集数据并通过各自的 LoRa组网将数据发送给主机。

嵌入式阿齐Archie 1万+

Kruskal算法&Prim算法的区别

贪心算法&Kruskal&Prim算法的区别: 贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。 贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是

木梓的博客 6549

uniapp微信小程序 - 解决输入框input软键盘弹起时页面整体上移问题,页面上推导致顶部出现元素遮挡问题,uniapp软键盘导致页面上移头部内容被错位遮住错乱,让页面头固定在顶部不动不会受影响!

解决uni-app微信小程序底部input输入框,键盘弹起时页面整体上移问题,当键盘弹起时,会导致页面整体上移,页面头固定在顶部不动,微信小程序键盘弹起时,底部输入框抬起至键盘上方,顶部导航栏固定不动,uni-app输入框,输入框在底部;当弹出键盘时,页面整体上移,页面头信息会消失不见,小程序底部input输入框,input组件弹起系统键盘时,键盘会顶住页面导致页面会上移,当键盘弹起时整个页面被挤压,导致元素上移或被覆盖,输入框能自动抬起至键盘上方,顶部导航栏保持固定,不被顶上去,如何解决这个问题,动态高度

✅ 精选推荐文章 1万+

图详解第三篇:最小生成树(Kruskal算法+Prim算法)

最小生成树:Kruskal算法+Prim算法

m0_70980326的博客 2万+

减法平均优化器(SABO)算法详解:从数学原理到工程应用

减法平均优化器(SABO)是一种基于数学概念的新型元启发式优化算法,由Trojanovský和Dehghani于2023年提出。该算法通过v-减法运算和平均值计算实现搜索优化,核心创新是采用目标函数值差异符号引导搜索方向。SABO具有参数少、结构简单、收敛快等特点,在高维复杂问题中表现优异。算法通过种群平均值保持多样性,利用符号函数确保搜索方向改进,自然平衡探索与开发。MATLAB实现显示其计算复杂度为O(N²·D),与主流群体智能算法相当。SABO不依赖生物或物理隐喻,数学基础坚实,在工程优化和机器学习领

qq_42212808的博客 164

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

图的最小生成树:Prim算法和Kruskal算法

1. 图的最小生成树 生成树的定义:如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的包含图中的所有顶点的极小连通子图。它并不唯一,从不同的顶点出发进行遍历,可以得到不同的生成树。 其中,权值最小的树就是最小生成树。 关于最小生成树最经典的应用模型就是城市通信线路网最小造价的问题:网络G表示n个城市之间的通信线路(其中顶点表示城市,边表示两个城市之

jinzhao1993的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构——图及其C++实现(2)最小生成树Kruskal算法和Prim算法

在上一篇文章中,我们对图的基本概念和图的存储结构及两种遍历方式做了了解,既然已经认识了图,那么对于图中的顶点来说,我们思考当面临“用最小代价把所有点连起来”这类问题时,我们该如何做?接下来我们我们引出关于图的另一个很重要的概念——最小生成树。

学习日记 749

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

图 - 最小生成树算法 - Kruskal - Prim

图 - 最小生成树算法 - Kruskal(克鲁斯卡尔) - Prim(普利姆)

2302_80023639的博客 869

prim算法_图的最小生成树Kruskal算法

昨天说了图的最小生成树的其中一种算法,Prim算法,今天就再来说一下平时用的比较多的另一种最小生成树算法,Kruskal(克鲁斯卡尔)算法。然后再来比较一下这两个算法之间的差异。首先回顾一下最小生成树到底是个什么东西。简单说就是在有权连通图中,找到一组边,把所有的点连接在一起,并且这组边的权值加和最小,就是这个图的最小生成树。效果大概如下图,图1,图2就是生成树,而图3因为边的权值加起来...

weixin_39878716的博客 101

图的最小生成树算法:Kruskal算法与Prim算法

图的最小生成树算法 Kruskal算法 Prim算法 Kruskal算法<\span> struct Node { public: int val; Node * father; Node(int _val) { val = _val; father = this; } }; struct Edge { Node * snode; Node * enode; int weight; Edge(Nod

小飞侠的博客 195

C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

1、Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树。 2、Kruskal 算法 直接寻找最小权值的边来构建最小生成树。 比较: Kruskal 算法主要是针对边来展开,边数少时效率会非常高,所以对于稀疏图有很大的优势。 Prim 算法针对顶点展开,对于稠密图,即边数非常多的情况下会更好。 具体代码如下:

oohaha_123的专栏 1994

图的最小生成树问题-python实现-Prim算法和Kruskal算法

文章目录库的版本号最小生成树的知识点PRIM算法Kruskal算法 库的版本号 列了这个是因为在学习过程中,会有很多文章,可能时间稍微久点了,用起来因为版本迭代,函数可能发生了变化,但你也不确实到底是什么问题。。这样指明版本,可以避免很多复现的困惑。 import numpy as np import sys print(sys.version) print(np.__version__) 3.9.5 (default, May 18 2021, 14:42:02) [MSC v.1916 64 bit

j_in2018的博客 1313

图的最小生成树算法的实现 prim and kruskal

两种算法的讲解请观看: https://www.bilibili.com/video/BV1Eb41177d1?from=search&seid=5569805741961941597 先来prim算法 //0:first vertex 1:second vertex 3:arc value int primArc[14][3] = { {0, 1, 4}, {0, 7, 8}, {1, 7, 11}, {1, 2, 8}, {2, 3, 7},

lkmmmqfn2222的博客 313

图的应用——最小生成树(Prim 算法和 Kruskal 算法)

参照2025年王道的数据结构考研复习指导书对Prim算法和Kruskal算法构造最小生成树的过程进行了详细的介绍。

kusunoki的博客 4016

Prim算法实现最小生成树MST(java)Prim算法是另一种生成图的最小生成树的算法,这里简单说一下Prim算法和Kruskal算法的在实现方面的区别: 1、Kruskal算法在生成最小生成树的

Prim算法是另一种生成图的最小生成树的算法,这里简单说一下Prim算法和Kruskal算法的在实现方面的区别: 1、Kruskal算法在生成最小生成树的过程中产生的是森林,Prim算法在执行过程中始终都是一棵树; 2、Kruskal和Prim实现上的最大区别是Kruskal不需要搜索每个顶点的邻接节点,而Prim中需要,所以Prim图构建时需要利用邻接链表进行构建,Kruskal不用! ...

不二的博客 562

ds图—最小生成树_最小生成树的两种方法:Kruskal 算法和 Prim 算法

(给算法爱好者加星标,修炼编程内功)来源:勿在浮砂筑高台https://blog.youkuaiyun.com/luoshixian099/article/details/51908175关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。连通网:在连...

weixin_39737240的博客 111
上一篇: 图的存储结构——邻接矩阵与边集数组
下一篇: L1-041 寻找250 (10 分)
黑色吊椅
博客等级 码龄9年 102粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值