在图论中,求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算法的更多相关文章

  1. 【数据结构】最小生成树之prim算法和kruskal算法

    在日常生活中解决问题经常需要考虑最优的问题,而最小生成树就是其中的一种.看了很多博客,先总结如下,只需要您20分钟的时间,就能完全理解. 比如:有四个村庄要修四条路,让村子能两两联系起来,这时就有最优 ...

  2. java实现最小生成树的prim算法和kruskal算法

    在边赋权图中,权值总和最小的生成树称为最小生成树.构造最小生成树有两种算法,分别是prim算法和kruskal算法.在边赋权图中,如下图所示: 在上述赋权图中,可以看到图的顶点编号和顶点之间邻接边的权 ...

  3. 最小生成树——Prim算法和Kruskal算法

    洛谷P3366 最小生成树板子题 这篇博客介绍两个算法:Prim算法和Kruskal算法,两个算法各有优劣 一般来说当图比较稀疏的时候,Kruskal算法比较快 而当图很密集,Prim算法就大显身手了 ...

  4. Prim算法和Dijkstra算法的异同

    Prim算法和Dijkstra算法的异同 之前一直觉得Prim和Dijkstra很相似,但是没有仔细对比: 今天看了下,主要有以下几点: 1: Prim是计算最小生成树的算法,比如为N个村庄修路,怎么 ...

  5. 最小生成树---Prim算法和Kruskal算法

    Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...

  6. 学习笔记之 prim算法和kruskal算法

    ~. 最近数据结构课讲到了prim算法,然而一直使用kruskal算法的我还不知prim的思想,实在是寝食难安,于此灯火通明之时写此随笔,以祭奠我睡过去的数 据结构课. 一,最小生成树之prim pr ...

  7. Prim算法和Kruskal算法(图论中的最小生成树算法)

    最小生成树在一个图中可以有多个,但是如果一个图中边的权值互不相同的话,那么最小生成树只可能存在一个,用反证法很容易就证明出来了. 当然最小生成树也是一个图中包含所有节点的权值和最低的子图. 在一个图中 ...

  8. 转载:最小生成树-Prim算法和Kruskal算法

    本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...

  9. MST最小生成树及Prim普鲁姆算法

    MST在前面学习了Kruskal算法,还有一种算法叫做Prim的.这两者的区别是Prim算法适合稠密图,比如说鸟巢这种几乎所有点都有相连的图.其时间复杂度为O(n^2),其时间复杂度与边的数目无关:而 ...

随机推荐

  1. eclipse代码注释的设置

    http://blog.csdn.net/shiyuezhong/article/details/8450578 1. eclipse用户名的设置: 在eclipse的安装路径下,打开eclipse. ...

  2. System.Data.DbType的字符串和数据库中字符串类型对应关系

    前两天项目中因为历史原因数据库中的一个字段是varchar类型,在做SQL参数化处理时候默认都是DbType.String, 免得查询出现数据转换,于是做类型一致,搜了下对应关系还没找到,只好自己打开 ...

  3. 用于显示上个月和下个月_PHP

    /** * 用于显示上个月和下个月 * @param int $sign 1:表示上个月 0:表示下个月 * @return string */ function GetMonth($sign=&qu ...

  4. 转-SecureCRT设置

    原帖地址:http://www.2cto.com/os/201410/341569.html 一.基本设置 1.修改设置 为了SecureCRT用起来更方便,需要做一些设置,需要修改的有如下几处: 1 ...

  5. 使用gSoap规避和修改ONVIF标准类型结构的解析

    ONVIF/gSoap依赖关系及问题 ONVIF是一组服务规范,标准参考 gSoap是一套基于实现SOAP通信接口的工具链 即是,当我们需要访问ONVIF的Web Service或实现对ONVIF部分 ...

  6. jQuery慢慢啃之核心(一)

    1. $("div > p"); div 元素的所有p子元素. $(document.body).css( "background", "bla ...

  7. 我用Emacs,后来转向Vim——Vim学习之Vim键盘图(绝对值得珍藏)

    Emacs本来就比较臃肿,麻烦.当我发现Vim键盘图时,我就渐渐转向Vim,追随Unix/Linux哲学去了.. 我用了Emacs三个月,因为它的学习曲线没Vim陡,这点吸引了,我使用Linux才7. ...

  8. Array.prototype.map()

    mdn上解释的特别详细 概述 map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组. 语法 array.map(callback[, thisArg]) 参数 callb ...

  9. PHP计划任务之关闭浏览器后仍然继续执行的函数 ignore_user_abort

    备忘一下这个函数: 函数名称:ignore_user_abort 本函数配置或取得使用端连接中断后,PHP 程序是否仍继续执行.默认值为中断连接后就停止执行.在 PHP 配置文件中 (php3.ini ...

  10. Html5游戏框架createJs的简单用法

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!http://www.it165.net/pro/html/201403/11105.html 楼主记忆力不好,最近刚好用了一下create ...