在图论中,求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. Java排序8大算法实现

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  2. 【转】iOS-Core-Animation-Advanced-Techniques(六)

    原文:http://www.cocoachina.com/ios/20150106/10839.html 基于定时器的动画和性能调优 基于定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇 ...

  3. 2016.7.13abstract

    abstract的使用: 1.当许多类中有相同的功能,功能的内容不同,那么我们向上提取功能的定义. 2当功能的定义被 abstract修饰后,那么它的类也要被abstract修饰,使其抽象化. 3被a ...

  4. Codeforces 193D Two Segments 解题报告

    先是在蓝桥杯的网站上看到一道题: 给出1~n的一个排列,求出区间内所有数是连续自然数的区间的个数.n<=50000. 由于数据较弱,即使用O(N^2)的算法也能拿到满分. 于是在CF上发现了这一 ...

  5. spring + maven +testng 测试常见依赖包问题

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法:添加缺少的jar包:commons-coll ...

  6. 百度分享 ajax 或分页后显示不出问题解决方案

    自从用了AJAX后,JS重新加载问题就如家常便饭般层出不穷啊.没有系统学习过js感觉亚历山大. 百度后,还是找到了解决办法. 百度分享创建了一个全局对象window._bd_share_main.通过 ...

  7. myisam和innodb区别

      InnoDB MyIsam 事务                        支持 不支持 锁 行锁 表锁 索引 B+树,数据和索引在一个文件中,必须有主键,如果不指定,会自动生成一个隐藏字段作 ...

  8. 用python选择及显示三级目录,可返回上层目录以及随时跳出。

    # -*- coding: utf-8 -*-"""Created on Fri Jul 29 09:43:38 2016 @author: yinggang" ...

  9. BAE 环境下配置 struts2 + spring + hibernate(SSH)(二)struts2

    在myeclipse下开发的 应用但是 放到BAE下就出现了问题,虽然显示发布成功,但是访问的时候就会出现503 Service Unavailable 错误.通过调整 web.xml 发现纯Serv ...

  10. CoreLocation MKMapView

    高德开发者平台 有开发指南 iOS9配置网络: <key>NSAppTransportSecurity</key> <dict> <key>NSAllo ...