图之最小生成树 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 交通规划

最小生成树(Prim算法和Kruskal算法)—理解与论证

向世界分享科学之美,让科学流行起来          对于一个给定的连通无向图G=(V,E),其最小生成树被定义如下:取边集E中的子集E‘构成连通树,同时满足,其中表示边(集...
  • MathThinker
  • MathThinker
  • 2015年08月23日 17:16
  • 2006

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

1. 图的最小生成树 生成树的定义:如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的包含图中的所有顶点的极小连通子图。它并不唯一,从不同的顶点出发进行遍...
  • jinzhao1993
  • jinzhao1993
  • 2016年04月29日 00:33
  • 1176

Prim算法 Kruskal算法 简述

Prim算法和Kruskal算法,都是用来找出图中最小生成树的算法,两个算法有些小差别。 Prim算法 又称普里姆算法,以图上的顶点为出发点,逐次选择到最小生成树顶点集距离最短的顶点为最小生成...
  • jerry81333
  • jerry81333
  • 2017年01月25日 06:28
  • 756

图 之 MST(最小生成树 — kruskal算法 )并查集实现

#并查集的优化: (1)       Find_Set(x)时,路径压缩寻找祖先时,我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度。为...
  • PeersLee
  • PeersLee
  • 2015年12月26日 17:41
  • 1793

最小生成树Prim与Kruskal算法的比较

最小生成树是图论问题中很基本的一个操作。常用的算法有Prim和Kruskal两种算法。本文对这两种算法稍作区别与讨论。Prim算法是依赖于点的算法。它的基本原理是从当前点寻找一个离自己(集合)最近的点...
  • Mollnn
  • Mollnn
  • 2016年09月19日 21:48
  • 3793

数学建模(14)——MATLAB实现最小生成树(Prim与Kruskal算法)

Prim算法 连通赋权图如上 邻接矩阵如下 0 50 60 0 0 0 0 0 0 0 65 40 ...
  • longxinghaofeng
  • longxinghaofeng
  • 2017年09月06日 21:14
  • 928

图论中最小生成树构造算法之Prim算法和Kruskal算法

图是 由顶点的有穷非空集合和点之间边的集合构成: G={V,E},V是顶点集合,E是顶点之间边的集合。根基顶点之间边有无方向性可分为:有向图和无向图: 在图中,当对边赋予有意义数值时候,成为网图。...
  • yanerhao
  • yanerhao
  • 2015年06月25日 16:24
  • 2549

最小生成树kruskal算法适合稀疏图(网络整理)8.1.3

#include #include #include #define MAXSIZE 100 typedef int Weight; typedef char Datatype; typedef s...
  • qq_26046771
  • qq_26046771
  • 2017年04月26日 19:53
  • 568

【最小生成树】Prim算法和Kruskal算法的区别对比

Prim算法和Kruskal算法都是从连通图中找出最小生成树的经典算法。从策略上来说,Prim算法是直接查找,多次寻找邻边的权重最小值,而Kruskal是需要先对权重排序后查找的。 所以说,Kr...
  • liuchuo
  • liuchuo
  • 2016年12月21日 21:59
  • 1697

[C++]最小生成树--Prim算法&Kruskal算法

最小生成树–Prim算法&Kruskal算法 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克...
  • stary_yan
  • stary_yan
  • 2016年05月16日 20:24
  • 8049
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图之最小生成树 Kruskal算法 Prim算法
举报原因:
原因补充:

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