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

原创 2016年08月28日 23:40:50

一.实际问题

最小生成树一般应用在网(带权的图)问题中,实际问题一般比如:
  假设要在n个城市间建立通信联络网,则联通n个城市只需要n-1条线路,但是每两个城市间都可以建设路线,而且城市与城市间建设代价是不同的,这就需要我们考虑一种经济的联络方式。
将问题转换成图的话,就如下图(圆圈代表城市,线代表线路,线上数值代表建设的代价),我们需要从中选择一条代价最小的建设方式。
这里写图片描述

二.基本思想

  一般情况下这类问题归于动态规划中的贪心算法(不一定是但大多数情况下是最优解)。
  这里写图片描述
  跟动态规划一样,我们假设上图弧线以下部分(白色圆圈c,i,h,g,f部分)已经找到最优解的话,那么我们考虑添加一个黑色圆圈时,只需要考虑白色圆圈c,i,h,g,f部分到黑色园圈所有线路中代价最小的线路与黑色园圈相连组成新的子问题最优解(比如白色圆圈c,i,h,g,f部分到最左边黑色圆圈有代价8或11线路,显然我们选择线路代价为8)。接下来介绍的Kruskal和Prim算法其基本思想大抵如此。

三.Kruskal算法

适合求解边稀疏网的最小生成树

克鲁斯卡尔算法首先把每一个节点当成一最小生成棵树,把所有的边从代价小到大排列。
然后逐个选择边(从小到大):
  判断边是否连接两个最小生成树,如果能够连接则把两棵最小生成树连接起来生成一个最小生成树;   如果这条边连接的是一棵树内两个节点的话就抛弃它,为什么呢?因为我们是从小到大选择的边,如果把当前这条边加入这棵树的话,树内必定会生成一个回路,就需要抛弃一条边,然而先前选择的所有的边都比当前这条边代价小,所以只能抛弃当前这条边。
  这里写图片描述
看上述示意图中,红圈部分就是代价高的线路被抛弃了。
算法实例:CCF 地铁修建

四.Prim算法

适合求解边稠密网的最小生成树

普西姆算法与克鲁斯卡尔算法不同,普西姆算法从始到终都只有一棵树。
首先选择任意一个顶点当成一棵树,把(树)和(其他节点)当成两个集合;
然后我们从(其他节点)到(树)线路中选择代价最小的线路,这条线路的端节点必然一个在(树)中,一个在(其他节点)中。把该条最小代价线路在(其他节点)集合中的节点转移到(树)中,从而形成新的最小生成树。重复上述步骤,到最后所有的节点都在(树)集合中。
这里写图片描述
看上述示意图中,始终只有黑色圆圈组成的(树),在只有一个黑点(图1)时,(树)与(其他集合)有两条线路,代价分别为4或8,显然选择4;
然后(树)与(其他集合)间线路就有8或11或8,按贪心算法,我们只需考虑一个子问题,所以选择其中一条代价为8的线路即可。
CCF 最优灌溉
算法实例:CCF 交通规划

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

数据结构面试之九——图的常见操作3之最小生成树

数据结构面试之九——图的常见操作3之最小生成树 题注:《面试宝典》有相关习题,但思路相对不清晰,排版有错误,作者对此参考相关书籍和自己观点进行了重写,供大家参考。 九、图的常见操作3之最小生成树 ...

CCF CSP认证 201703-4 地铁修建 Dijkstra最短路 或 Kruskal最小生成树

题目: 试题编号: 201703-4 试题名称: 地铁修建 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   A市有n个交通枢纽,其中1号和n号...

最小生成树

假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时,自然会考虑一个问题,就是如何在最节省经费的前提下建立这个通信网。类似此类的问题很多,比如煤气管道问题等,这些问题都等价于,在...
  • mevicky
  • mevicky
  • 2015年05月25日 15:15
  • 1048

最小生成树

最小生成树,主要算法是普利姆算法和克鲁斯卡尔算法

关于图的常用算法——Dijkstra单源最短路径、Floyd多源最短路径、Prim和Kruskal最小生成树算法

Dijkstra最短路径算法是计算某一点到其它点的最短距离的算法。 Floyd算法是用来计算图中所有点之间的最短距离,可参考:http://developer.51cto.com/art/20...
  • jmspan
  • jmspan
  • 2016年06月10日 15:29
  • 1835

数据结构与算法之最小生成树-普林算法(Prim)/克鲁斯卡尔算法(Kruskal)

1 问题提出1.1 一个公司计划建立一个通信网络来连接它的一个计算机中心。可以用租用的电话线连接这些中心的任何一对。应当妊娠瘙痒哪些连接,以便保证在任何两个计算机中心之间都有通路,且网络的总成本最小?...

poj 1287||zoj 1372 Networking 最小生成树 kruskal 克鲁斯卡尔算法

这道题的难点在于边的数量是unlimited的,有无限条,用prim算法可以很容易的解出,不过个人比较喜欢用Kruskal算法,所以就想了办法处理了一下数据,然后就可以用Kruskal算法解了 主要...

图结构之最小生成树(MST)——Prims(普里姆)算法、Kruskal(克鲁斯卡尔)算法

最小生成树的两个经典算法——Prims(普里姆)算法、Kruskal(克鲁斯卡尔)算法,笔者自己分别理解为:割边、加边...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图之最小生成树 Kruskal算法 Prim算法
举报原因:
原因补充:

(最多只允许输入30个字)