算法对比: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),其时间复杂度与边的数目无关:而 ...
随机推荐
- 打造属于前端的Uri解析器
今天和大家一起讨论一下如何打造一个属于前端的url参数解析器.如果你是一个Web开发工程师,如果你了解过后端开发语言,譬如:PHP,Java等,那么你对下面的代码应该不会陌生: $kw = $_GET ...
- 段落排版--中文字间距、字母间距(letter-spacing, word-spacing)
中文字间隔.字母间隔设置: 如果想在网页排版中设置文字间隔或者字母间隔就可以使用 letter-spacing 来实现,如下面代码: h1{ letter-spacing:50px; } ... ...
- [转]Delphi执行CMD命令
今天看到有人在问用代码执行CMD命令的问题,就总结一下用法,也算做个备忘. Delphi中,执行命令或者运行一个程序有2个函数,一个是winexec,一个是shellexecute.这两个大家应该都见 ...
- javascript——函数属性和方法
<script type="text/javascript"> //每个函数都包含两个属性:length 和 prototype //length:当前函数希望接受的命 ...
- IoC模式(控制反转)(转)
转自:http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html,写的很好,用C#代码解释控制反转,然后更进一步,提到依赖注入是控制反转的 ...
- jQuery运维开发之第十七天
JQuery 学习参考网址http://jquery.cuishifeng.cn/ python中叫模块,在DOM/BOM/Javascript中叫类库 现在的JQ版本有:1.x 2.x 3.x 建议 ...
- windows live writer 下载及安装
windowslive writer下载地址: http://www.microsoft.com/en-us/download/details.aspx?id=8621(不知为啥,这里我无法下载)或 ...
- HTML部分标签的含义(2)
1,ul标签,添加新闻信息列表 使用ul标签,信息无先后顺序 这些列表就可以用ul-li标签来完成 语法:<ul> <li>信息</li> <li>信息 ...
- python学习的一些感悟
首先声明,这里用到的库是在coursera上学习时,老师建立的一个库 #timer import simplegui import random # global state message = &q ...
- Unity NGUI 网络斗地主 -制作图集 Atlas
Unity NGUI 网络斗地主 -制作图集 Atlas by @杨海龙 开发环境 Win7+Unity4.2.1f4+NGUI 3.0.4版本 这一节告诉大家如何制作(图集)Atlas! 1.首 ...