算法对比:Prim算法与Dijskra算法
在图论中,求MST的Prim算法和求最短路的Dijskra算法非常像。可是我一直都对这两个算法处于要懂不懂的状态,现在,就来总结一下这两个算法。
最小生成树(MST)—Prim算法:
算法步骤:
•将顶点集V分成两个集合A和B,其中集合A表示目前已经在MST中的顶点,而集合B则表示目前不在MST中的顶点。
•寻找与集合A连通的最短的边(u,v),将这条边加入最小生成树中。(此时,与(u,v)相连的顶点,不妨设为Bi,也应加入集合A中。
•重复第二步,直至集合B为空集。
正确性证明:
1、由归纳法可知,只需要证明 “每次向集合A中加入一条边后都能保证,集合A这个生成树是关联到集合A中所有点的最小生成树”,就能证明Prim算法的正确性。下面用反证法证明。
2、若A此时是最小生成树,加入边(u,v)(其中u是A中的点,v不是),加入以后集合为A',反设A'不是其关联点的最小生成树。则存在某个点k使得连接边(k,v),去掉边(u,v)能将A'变为关联节点的最小生成树,那么就意味着边权w(k,v) < w(u,v),而如果这样,那么将节点v加入A时添加的边就是(k,v)而不是(u,v),矛盾。得证
PS:这里给出一个别的证明:http://www.cnblogs.com/sky-view/p/3250972.html
另外,学习最小生成树的时候,网上的很多博文、资料、题解都并没有给出证明过程而是只给出结论,建议看一下IOI2004吴景岳的论文。
最短路——Dijskra算法(求正权图中的最短路):
算法步骤:
•将顶点集V分成两个集合A和B,其中集合A表示目前已经在求出最短路的节点,而集合B则表示目前没有求出最短路的节点。
•每次将点加入集合A时,都维护一个数组d[i],表示节点i与起点通过A中的点相连所需要的最短路径长度。
•每次要向A中加入点时,都加入d[i]值最小的,且在集合B中的点。
•不断向集合A中加入点,直到集合B为空。
下图为白书中的伪代码:

正确性证明:
1、首先要明确一点,按照Dijskra算法形成的集合A,对任意A中的点i和B中的点j,i点到起点的最短路径已经求出设为d[i],j点到起点的最短距离设为d[j],则一定有有d[i] <= d[j],因为A中的A.size()个点是所有点中离起点距离最近的A.size()个点。
3、假设此时A中所有节点的d[]值即为其最短路,并且即将将B集合中的j点添加到A中。对于j点,它到起点的最短路如果含有边(j, k),则有两种可能出现的情况:
(1)、此时k点已经在集合A中,则可以求出j点最短路d[j];
(2)、此时k点不在A中,此时k点到起点的最短路径上有一条边为(k, k1),若点k1不在A中,则找点k1的最短路径上的边(k1, k2)。。。一直找到点kt,使得kt在B中,kt最短路径上的边(kt, k(t+1))上点k(t+1)在A中。这样,因为此时要将j点加入A中,且j点和kt点一定不同,所以d[j] <= d[kt],而因为边权为正,所以d[kt] < d[k],所以d[j] < d[k] < d[k] + w(j, k) = d[j],所以此种情况矛盾。所以k点一定在集合A中。
所以,算法正确。
算法对比:Prim算法与Dijskra算法的更多相关文章
- 【数据结构】最小生成树之prim算法和kruskal算法
在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种.看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解. 比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优 ...
- java实现最小生成树的prim算法和kruskal算法
在边赋权图中,权值总和最小的生成树称为最小生成树.构造最小生成树有两种算法,分别是prim算法和kruskal算法.在边赋权图中,如下图所示: 在上述赋权图中,可以看到图的顶点编号和顶点之间邻接边的权 ...
- 最小生成树——Prim算法和Kruskal算法
洛谷P3366 最小生成树板子题 这篇博客介绍两个算法:Prim算法和Kruskal算法,两个算法各有优劣 一般来说当图比较稀疏的时候,Kruskal算法比较快 而当图很密集,Prim算法就大显身手了 ...
- Prim算法和Dijkstra算法的异同
Prim算法和Dijkstra算法的异同 之前一直觉得Prim和Dijkstra很相似,但是没有仔细对比: 今天看了下,主要有以下几点: 1: Prim是计算最小生成树的算法,比如为N个村庄修路,怎么 ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- 学习笔记之 prim算法和kruskal算法
~. 最近数据结构课讲到了prim算法,然而一直使用kruskal算法的我还不知prim的思想,实在是寝食难安,于此灯火通明之时写此随笔,以祭奠我睡过去的数 据结构课. 一,最小生成树之prim pr ...
- Prim算法和Kruskal算法(图论中的最小生成树算法)
最小生成树在一个图中可以有多个,但是如果一个图中边的权值互不相同的话,那么最小生成树只可能存在一个,用反证法很容易就证明出来了. 当然最小生成树也是一个图中包含所有节点的权值和最低的子图. 在一个图中 ...
- 转载:最小生成树-Prim算法和Kruskal算法
本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...
- MST最小生成树及Prim普鲁姆算法
MST在前面学习了Kruskal算法,还有一种算法叫做Prim的.这两者的区别是Prim算法适合稠密图,比如说鸟巢这种几乎所有点都有相连的图.其时间复杂度为O(n^2),其时间复杂度与边的数目无关:而 ...
随机推荐
- android入门系列- TextView EditText Button ImageView 的简单应用
第一篇原创,其实自己就是一菜鸟,简单分享点基本知识吧.希望能有所帮助吧. TextView EditText Button ImageView 这几个控件可能是Android开发中最常用.最基本的几个 ...
- string.Join和Reverse的简单使用示例
String.Join 方法 (String, String[]) 串联字符串数组的所有元素,其中在每个元素之间使用指定的分隔符. 例如,如果 separator 为“,”且 value 的元素为“a ...
- 九、C# 合式类型
本章要描述如何最终完善类型声明. 1.重写Ojbect中的成员 重写ToString() 默认情况下,在任何对象上调用 ToString()会返回类的完全限定名称,所以有时候需要重载这个函数, ...
- 用css3实现鼠标移进去当前亮其他变灰
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 数组Api .map()的使用
之前并没有过多的使用过这个Api,在此记录下对其的理解,方便以后多多使用. 首先是对map的说明: var mappedArray = array.map(callback[, thisObject] ...
- du和df不一致的解决方法
df:disk free,统计的是当前系统中空闲的磁盘du:disk usage,统计的是正在使用的空闲的磁盘.如果一个文件被删除之后,使用这个文件的进程未重启,则会出现df和du不一致的情况. 解决 ...
- DevExpress::XtraBars::BarEditItem获取EditValue值事件
//视图设计器中拖动一个barManager,添加一个bar,再添加一个BarEditItem控件,如下代码: private: DevExpress::XtraEditors::Repository ...
- Execl DataTime Format Number
Excel 中日期类型所保存的值是数值型.只是设置了为日期格式,通过公式转换从而得出我们平时常用的日期内容.也很好理解这公式所要说明的意思.数值是个浮点型可以分成2部分看.整数部分:年月日(日期)小数 ...
- SharePoint 设置Lookup 字段的值
如何设置Lookup字段的值, 首先我们同样需要了解SPFieldLookupValueCollection和SPFieldLookupValue, 这2个类的原理和之前所讲解到SPFieldUser ...
- 为什么要用专业的ETL
这两天一直在思考一个问题,为什么要用专业的etl工具进行数据清洗,原因如下: ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库 ...