【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解

说说最小生成树(Minimum Spanning Tree) minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点、无环、路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者叫切断,会使图分离成为两个不相连的顶点集. 它基于树的两个基本属性: 为树的任意两个节点间添加一条边,会在树中形成一个环. 删去树中的一条边,会将原树分离成两棵不相连的树. cros 阅读详情

本节纲要

  • 什么是图(network)
  • 什么是最小生成树 (minimum spanning tree)
  • 最小生成树的算法

什么是图(network)?

这里的图当然不是我们日常说的图片或者地图。通常情况下,我们把图看成是一种由“顶点”和“边”组成的抽象网络。在各个“顶点“间可以由”边“连接起来,使两个顶点间相互关联起来。图的结构可以描述多种复杂的数据对象,应用较为广泛,看下图:

为了更好地说明问题,下面我们看一个比较老套的通信问题:

在各大城市中建设通信网络,如下图所示,每个圆圈代表一座城市,而边上的数字代表了建立通信连接的价格。那么,请问怎样才能以最小的价格使各大城市能直接或者间接地连接起来呢?

我们需要注意两点:

  • 最小的价格
  • 各大城市可以是直接或者间接相连的

稍稍留心可以发现,题目的要求是,城市只需要直接或者间接相连,因此,为了节省成本,我们稍稍优化一下上述方案如下:

可以看到,我们砍掉了原先在AD,BE之间的两条道路,建设价格自然就降下来了。当然这个方案也是符合我们题目的要求的。按照国际惯例,这里要说蛋是了。上面的实例由于数据很简单,优化的方案很easy就看出来了。但在实际中,数据量往往是非常庞大的。所以,我们更倾向于设计一种方法,然后利用计算机强大的运算能力帮我们处理这些数据得出最优的方案。
那么,针对上述问题,我们一起来看看如何应用图的相关知识来实现吧。

什么是最小生成树(minimum spanning tree)

为了直观,还是用图片给大家解释一下:

  • 对于一个图而言,它可以生成很多树,如右侧图2,图3就是由图1生成的。

  • 从上面可以看出生成树是将原图的全部顶点以最少的边连通的子图,对于有n个顶点的连通图,生成树有n-1条边,若边数小于此数就不可能将各顶点连通,如果边的数量多于n-1条边,必定会产生回路。

  • 对于一个带权连通图,生成树不同,树中各边上权值总和也不同,权值总和最小的生成树则称为图的最小生成树。

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

Prim算法

基本思想:
假设有一个无向带权图G=(V,E),它的最小生成树为MinTree=(V,T),其中V为顶点集合,T为边的集合。求边的集合T的步骤如下:

①令 U={u0},T={}。其中U为最小生成树的顶点集合,开始时U中只含有顶点u0(u0可以为集合V中任意一项),在开始构造最小生成树时我们从u0出发。

②对所有u∈U,v∈(V – U)(其中u,v表示顶点)的边(u,v)中,找一条权值最小的边(u’,v’),将这条边加入到集合T中,将顶点v’加入集合U中。

③直到将V中所有顶点加入U中,则算法结束,否则一直重复以上两步。

④符号说明:我们用大写字母表示集合,用小写字母表示顶点元素,用<>表示两点之间的边。

为了更好的说明问题,我们下面一步一步来为大家展示这个过程。

  1. 初始状态:U={a} V={b,c,d,e } T={}
  2. 集合U和V相关联的权值最小的边是<a,b style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">,于是我们将b加入U。U={a,b},V={d,c,e },T={<a,b style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">}
  3. 此时集合U和V相关联的权值最小的边是<b,c style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">,于是我们将c加入U。U={a,b,c} ,V={d,e },T={<a,b style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">, <b,c style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">}
  4. 显然此时集合U和V中相关联的权值最小的边是<c,d style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">,于是我们将d加入U。U={a,b,c,d} ,V={e },T={<a,b style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">, <b,c style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">,<c,d style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">}
  5. 最后集合U和V中相关联的权值最小的边是<d,e style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">,于是将e加入U。U={a,b,c,d,e} ,V={},T={<a,b style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">, <b,c style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">,<c,d style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">,<d,e style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">}。

    到此所有点访问完毕。

代码实现

 1//prime算法
2//将城市X标记为visit=true时,就表示该城市加入到集合U,用sum累加记录边的总费用
3
4#include<iostream>
5#define NO 99999999   //99999999代表两点之间不可达
6#define N 5
最小生成树算法 | Kruskal’s Minimum Spanning Tree Algorithm 生成树是连通图的子集,其中所有边都是连接的,即可以从任一边遍历到任何边,中间有或没有中间节点。此外,生成树中不得有任何循环。因此我们可以说,如果一个连通图中有N个顶点,那么生成树可能具有的边数为N-1。什么是最小生成树? 阅读详情

相关推荐

算法 - 图的实例 - 最小生成树 (Minimum Spanning Tree)

本文将介绍最小生成树的基础知识,并用C++实现克鲁斯卡尔算法(Kruskal)和普利姆算法(Prim)。

DarkRabbit的专栏 1562

Minimum/Maximum Spanning Tree/Forest

MST问题。对于一个有权无向图,使其原有连通块保持连通性并形成树,同时边权之和最小。换一种说法,最小生成树或者最小生成森林。 两个算法一个推论。 Kruskal's Algorithm 基于贪心。将边排序,从最短边开始,若添加了此边,两个不相连的连通块相连了,就添加,否则看下一条。添加到边数为点数-1为止。用并查集检验是否连通。注意Kruskal的原理为,对于图中任意一个点x,对于x点连出去...

Razhme的博客 2295

图论最小生成树Kruskal避圈算法

用Kruskal避圈算法求最小生成树的源代码

PayPal支付集成完全指南:开源库实践

本文介绍了如何从零开始集成PayPal支付功能。首先概述了PayPal提供的多语言SDK和开源库,包括PHP、Python、Node.js等版本。然后详细说明了准备工作,包括注册开发者账号、获取API凭证和使用沙盒环境测试。文章以Node.js为例,演示了安装SDK、基础配置和实现支付流程的完整代码,包括创建订单和捕获支付两个核心功能。最后提及了订阅支付等高级功能,为开发者提供了完整的支付集成方案。通过清晰的代码示例和步骤说明,帮助开发者快速实现PayPal支付功能集成。

2501_93501927的博客 1260

PMSM无感foc控制(滑模-反正切-PLL)【仿真模型搭建教程】(附模型)

本文主要目的是教大家如何把文献中的公式转换成仿真模型。 首先介绍滑模控制的原理及如何搭建simulink模型。 1.1基于反电势估计位置原理 永磁同步电机在静止坐标系αβ下的电压方程: 扩展反电动势包含转子位置信息,并且αβ轴下扩展反电动势的反正切函数正好就等于位置角theta。 1.2 滑模控制原理(比较重要的点是以电机电流模型推导展开) 通过滑模观测得到鲁棒性比较高的αβ轴下扩展反电动势,并求其反正切函数,得到位置信息。 /*********************...

weixin_44769876的博客 1万+

创建动态代理对象bean,并动态注入到spring容器中

使用过Mybatis的同学,应该都知道,我们只需要编写mybatis对应的接口和mapper XML文件即可,并不需要手动编写mapper接口的实现。这里mybatis就用到了JDK动态代理,并且将生成的接口代理对象动态注入到Spring容器中。 这里涉及到几个问题。也许有同学会有疑问,我们直接编写好类,加入@Component等注解不是可以注入了吗?或者在配置类(@Configuration)...

lichuangcsdn的博客 3万+

「点燃我,温暖你」用Python制作一个动态爱心效果

最近「点燃我,温暖你」这部剧非常火,讲述的是程序员的爱情故事。其中陈飞宇饰演的男主李峋,在剧中用程序做出的爱心跳动效果,非常炫。

Modeler_xiaoyu的博客 1万+

用AI画电路板AI EDA初探Creating WiFi Radio with CELUS: A Step-by-Step Tutorial 使用CELU.IO创建WiFi收音机:分步教程

结论:整体还不太成熟,所选器件单元是欧美思维,器件选型成本和咱们华强北还是无法比。可以关注迭代,看客就当走马观花就行了;不过里面的单元模块还带有AI提问的这个比较好,值得国内EDA从业者学习。话不多说上正文:本教程目的是让我们深入了解如何使用CELUS设计平台构建WiFi收音机实战项目。本指南的重点是使用该平台来选择正确的解决方案,并整合一个项目,让您可以将音乐和节目从互联网直接传输到您自己构建的扬声器。

2301_81235726的博客 1万+

C# Code-Behind 技术全面解析

Code-Behind 是 ASP.NET Web Forms 中的一种技术模式,通过将用户界面标记(.aspx文件)与程序逻辑代码(.aspx.cs文件)分离,实现表现层与逻辑层的解耦。其核心思想是前端展示与后台逻辑的物理文件分离,通过ASP.NET编译器将两者合并编译成一个Page类并执行。Code-Behind 的优势包括较好的代码组织、较高的开发效率,尤其适合快速开发数据驱动应用。然而,与现代开发模式如ASP.NET MVC、ASP.NET Core和Blazor相比,Code-Behind 在可维

记录学习的过程 958

【Altium designer】如何添加过孔阵列

按下图1指示,执行【Tool】菜单栏下【Via Stitching/Shielding】选项卡中的【Add Stitching to Net...】选项 图1 “添加过孔阵列”选项 点击【Add Stitching to Net...】选项后,会跳出一个窗口,让我们设置过孔阵列的参数信息,如下图2所示。 图2 过孔阵列参数设置 过孔阵列区域:勾选该选项框,即可绘制多边形区域; 过孔内径与焊盘直径:比如内径 【Hole Size】设为12mil,焊盘直径【Diameter】设为24mil; .

夜半少年的博客 2万+

ICC2如何写出floorplan信息

不用-exclude 的话rows_tracks / vias /blockages / routing_rules信息都会写出去,即便用了-include {macro ports}也不行,所以不介意这些东西的话可以用以下两种种def方式去写floorplan。write_floorplan用法和write_def一样,因为写出来的文件夹里就包含def,用write_floorplan的好处和innovus saveFPlan一样,都能写出voltage area和bound信息。

m0_61544122的博客 1072

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 【数据结构】循环链表&&双向链表详解和代码实例
下一篇: 【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解
infinitor
博客等级 码龄9年 403粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值