一个正在进行信息化建设的国家级贫困县,需要在下属9个乡镇之间架设光纤网络。为减少建设难度,光纤网主要沿着这9个乡镇之间互连的公路进行铺设。这9个乡镇之间的公路网以及相互之间的距离(单位:km)如下图所示:

如果你是工程师,该怎样设计线路铺设方案?当然,你可以直接把所有的公路网都铺设上光缆,这样的线路总长度是247公里。但如果你是这样想的,那么我一定会怀疑你到底是不是一名工程师!

你可以再设计一种方案,如下图中粗线条所示:

这种铺设方案的线路总长是161公里,这比前面的强多了。再进一步,你还可以得到2种更短的铺设线路:

这2种线路的总长分别是100km和95km。显然比前面的方案节省了更多。当然,这种线路方案你还可以列出很多。

在这个实际应用中,我们的目的,是要寻求一种连接图中所有节点的、成本最低的方式。本质上,再抽象一层,这是个组合优化问题,可以使用一些智能优化算法来解决。而在这个实例上,我们寻求使用更简单的图论方式解决。

当然,这是个老问题了,至少在20世纪初就已经提出了,它的解决方案最初是1926年由捷克数学家在构建一个电力网络的过程中首先提出来的。这种方式经常被用于架设电网、通信网、公路网、铁路网,甚至是架构某种形式的计算集群(这些任务都需要我们连接其中的每一个节点),也是解决旅行商问题的基础。

再回到这个问题本身,要包含图中所有的顶点n,同时代价最少,第一个想到的自然是减少边的数量,而要连接所有n个顶点,显然至少需要n-1条边。而我们知道一颗树(tree)就是n个顶点,n-1条边。

所以,这里引申出图论中的一个新概念:生成树(spanning tree)。含有图中全部n个顶点,以及包含图中某些n-1条边的一颗树是该图的生成树。有几个情况需要注意:

  • 图本身必须是无向连通图;
    如果是非连通图,那就不存在生成树的概念。我们知道树中任意2点都是连通的。如果是有向图,那也没有这个概念。
  • 生成树不止一种;
    生成树的n-1条边可以在图的边集合中选择,当然不止一种情况。
  • 每个生成树代价不同。
    一般使用生成树中边的权重值总和代表每个生成树的代价。
    而我们的工作就是要找到所有生成树中代价最小的,这就是最小生成树(minimum spanning tree)问题。

那么,我们构建最小生成树的时候,要从哪里着手呢?

首先,我们从边出发,先找到最短的边。

如上图所示,边e-i显然是最短的。最小生成树会不会一定包含这条边?根据上面的描述,生成树要包含所有的顶点,因此,生成树一定包含e,i两个顶点,所以也必然包含一条e,i之间的路径。我们随便构成一个生成树,见下图:

图中粗线条为构成的生成树,并不包含最短边e-i。e,i之间的路径是e-f-j-d-b-a-i,如果我们将边e-i加入这个生成树,必然构成环。

要消除这个环,从而构成新的生成树,我们可以移除e-f-j-d-b-a-i-e环路上除边e-i的其他任意一条边。例如,移除a-b或b-d。我们看看移除b-d,构成了一个新的生成树。

这个新的生成树与原先的生成树就差在一个包含边b-d,不包含边e-i,一个包含边e-i,不包含b-d。而新的生成树代价比原先的生成树代价低,因为边e-i是最短的,代价比边b-d要小。

因此,无论移除其他边中的哪条边,重新构成新的生成树都比最先的生成树代价小。因为哪条边的代价都比边e-i的代价要大。也就是说,任何不包含最短边的生成树结构都可以被做的更小。所以,最小生成树一定包含最短边。(后面的文章我们将看到,这也是最小生成树算法Kruskal的基本思想)。

其次,我们从顶点出发,来看看有什么新的结论。还是上面的图,我们以顶点b为例,根据生成树的定义,顶点b与其它顶点肯定是连通的。而顶点b有2条边,即边a-b,边b-d。这意味着最小生成树必然包含这2条边中的一个。而边b-d比a-b要短,因此选择b-d是否更合理?

我们用反证法证明下,假设选择较长的边a-b是更好的选择,即最小生成树包含a-b这条边。我们把边b-d也加入这个生成树,形成了一个环。在这个环中,如果移除边a-b,那么得到的新生成树代价比以前的要小,这与假设的选择较长边更好相矛盾。所以在b点选择较短的边才有可能生成最小生成树。(后面的文章我们将看到,这也是最小生成树算法Prim的基本思想)。

参考文献:

1.《大话数据结构》 程杰 清华大学出版社
2.《Python算法教程》Magnus Lie Hetland 人民邮电出版社

图论(八)最小生成树相关推荐

  1. 数据结构实验之图论九:最小生成树_初高中数学竞赛训练----图论初步2

    例题中有2019年罗马尼亚大师赛第3试题 树 树:一个连通图,如果没有一个环,则叫树. 森林:若干个独立的树形成一个森林. 链:一个特殊的树是节点中,除去两个节点的度为1,其它均为2,叫做链. 二叉树 ...

  2. 数据结构实验之图论九:最小生成树_每天5分钟用C#学习数据结构(25)图 Part 6

    [基础知识]| 作者 / Edison Zhou 这是恰童鞋骚年的第221篇原创文章 上一篇介绍了非连通图如何实现遍历,本篇我们再来看看生成树与最小生成树,以及实现最小生成树的一个算法:Prim算法. ...

  3. ssl1615-Frogger【图论,最小生成树,并查集】

    题目 给一个无向图,要求从点1到点2的一条路,要求这条路上的边的最大值尽量小. 输入输入 多组数据,每个数据n+1行,分别是n和点的坐标 2 0 0 3 4 3 17 4 19 4 18 5 0 输出 ...

  4. ssl2346-联络员【图论,最小生成树】

    题目 一个图,给几条固定的边,求最小生成树 输入 第一行n,m表示n个点,有m条边,每行四个非负整数,p,u,v,w 当p=1时,表示这个边为固定边(必须要):当p=2时,表示一条边:u,v,w表示点 ...

  5. 图论复习——最小生成树MST

    知识点 MST的构造 Boruvka算法常用于解决这类问题:给你n个点,每个点有点权,任意两个点之间有边权,边权为两个点权用过某种计算方式得出,求最小生成树.动图 MST上的确定性和存在性问题 最小生 ...

  6. 图论 —— 生成树 —— 最小生成树 —— Kruskal

    [基本思想] Kruskal 算法基本思想是并查集思想,将所有边升序排序,并认为每一个点都是孤立的,分属 n 个独立的集合. 按顺序枚举每一条边,如果这条边连接的两个点分属两个不同的集合,那么就将这条 ...

  7. 图论 —— 生成树 —— 最小生成树 —— Prim

    [基本思想] Prim 算法基本思想是蓝白点思想,用白点代表已进入最小生成树的点,蓝点代表未进入最小生成树的点. 每次循环都将一个蓝点 u 变为白点,并且此蓝点 u 与白点相连的最小边权 min[u] ...

  8. i - 数据结构实验之图论九:最小生成树_「核心考点」2021计算机数据结构

    摘要:考研各项科目中,专业课的重要性不言而喻.与公共课相比,专业课的难度往往更大一些,出题会更深入.更全面,更考察考生的水平和能力.所以复习千万不能掉以轻心,即便本科已经有了不错的基础,也有可能因为研 ...

  9. 【图论】最小生成树学习笔记

    一.主要算法 Prim 给定一张无向图,求它的最小生成树. 初始时我们将s打上标记.对于每个未标记的点i,我们记f[i]表示i连向已标记的点的边中,边权(到生成树距离)的最小值. 每次我们找到未标记的 ...

  10. [Java]图论进阶--最小生成树算法

    专栏简介 :java语法及数据结构 题目来源:leetcode,牛客,剑指offer. 创作目标:记录学习MySql学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表 ...

最新文章

  1. 改善C#程序的建议6:在线程同步中使用信号量
  2. 如何确定开关电源TL431反馈回路的参数
  3. leetcode算法题--统计全为 1 的正方形子矩阵
  4. 【机器学习】三层神经网络
  5. 前沿分享|阿里云数据库资深技术专家 姚奕玮:AnalyticDB MySQL离在线一体化技术揭秘
  6. 已经发车的票还能取出来吗_高铁票在车已经开了,但我没上车也没有取票的情况下,还能取出票吗?...
  7. C#json数据的序列化和反序列化(将数据转换为对象或对象集合)
  8. 如何下载python安装包的所有依赖_如何将包含所有依赖项的python包安装到Docker镜像中?...
  9. @程序员 天冷了,你准备抱键盘还是抱女朋友取暖?
  10. 移动应用开发商的生存之道
  11. 剪枝乱炖 | 模型加速与压缩
  12. 联想拯救者y7学计算机可以用吗,2018什么笔记本电脑好 联想拯救者y7000评测
  13. 13.56MHZ刷卡芯片CI521兼容cv520/ci520支持A卡B卡MIFARE协议
  14. 微信小程序:网课查题微信小程序源码下载,题库资源丰富自动采集,支持语音拍照识别
  15. 批处理对文件夹、所有子文件夹内的文件重命名、删除
  16. Python+selenium实现Drcom校园网自动检测网络以及自动登录
  17. .NET Data Provider
  18. Python读取Excel表格效率对比(openpyxl、xrld、csv)
  19. Gitlab CI/CD教程以及实战docker自动部署前端项目(全)
  20. 边沿检测电路的多种实现

热门文章

  1. 这 9 个 Java 开源项目 yyds,你知道几个?
  2. 推荐SpringBoot互联网企业级别的开源支付系统
  3. 惊呆了,JDK中这些常用方法也有Bug?
  4. 再见,Eclipse...
  5. Java 技术之动态代理机制
  6. 杭电1284钱币兑换问题—背包dp/母函数(java)
  7. Java消息中间件(activeMQ)
  8. 什么样的编程姿势才没有bug
  9. 2020 我的C++学习之路 C++PrimerPlus第十章课后习题
  10. 上海交大python答案_上海交通大学python期末考试样题加解析