在图论中,求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. windows下eclipse+hadoop2

    windows下eclipse+hadoop2.4开发手册 1.解压下载的hadoop2.4,到任意盘符,例如D:\hadoop-2.4.0. 2.设置环境变量 ①新建系统变量,如下所示. ②将新建的 ...

  2. if elsif;报错;new赋值

    1. IF INSERTING THEN          BEGIN 中间不能为空          END;ELSIF DELETING THEN         BEGIN          E ...

  3. Zend Server安装后首次运行就出现Internal Server Error的解决

    无论是使用哪个版本的Zend Server来搭建PHP服务器,首次运行都会出现Internal Server Error的错误,对很多新手而言,每当看到这种错误时,那一刻内心绝对都是崩溃的.然而,这个 ...

  4. iOS中MVVM的架构设计与团队协作

    对MVVM的理解主要是借鉴于之前的用过的MVC的Web框架,之前用过ThinkPHP框架,和SSH框架,都是MVC的架构模式,今天MVVM与传统的MVC可谓是极为相似,也可以说是兄弟关系,也就是一家人 ...

  5. [转]dos命令 cd命令使用说明[图文说明]

    Cddir(change directory,可以缩写为cd),其功能是显示当前目录的名称,或更改当前的目录. 应用时公带一个驱动器号(如: cd c:)在命令行cmd中输入 cd /? 可显示帮助信 ...

  6. C++ Reference 的“三位一体”诠释

    C++ 是介于汇编语言与高级语言之间的一种“全能”语言.它的能力是其他任何基于VMA(冯-诺曼架构)计算机的高级程序设计语言无法望其项背的,而性能也只有C语言可与之伯仲. 然而长期以来,喜欢C++和憎 ...

  7. 你应该了解的5个JavaScript调试技巧

    在某些情况下需要更好的工具,下面是其中的一些佼佼者,我敢肯定你会发现它们的有用之处: 1. debugger; 正如我之前提到的,你可以使用“debugger;”语句在代码中加入强制断点. 需要断点条 ...

  8. Android Toast和Notification

    1. Toast用法 Toast 可以设置:时间,位置,自定义View 1.1 最普通的Toast Toast.makeText(ToastActivity.this, "CarloZ Sh ...

  9. python自动开发之(ajax)第二十天

    1.Django请求的生命周期 路由系统 -> 试图函数(获取模板+数据=>渲染) -> 字符串返回给用户 2.路由系统 /index/ -> 函数或类.as_view() / ...

  10. python模块之socket

    43.python模块之socket:       Python在网络通讯方面功能强大,学习一下Socket通讯的基本方式 UDP通讯: Server: import socket port=8081 ...