Dijkstra算法的另一种证明

按:今天看Tanenbaum的计算机网络时讲到了Dijkstra算法。关于算法的正确性,《算法导论》给出了严格的证明。CLRS的证明基于一个通用的框架,非常清晰。今天只是随意想想是否有其他证明的方式,结果发现是有的。虽然这种证明方法可能早已有人用过,不算新鲜。不过自己想了一通就把它放到这里纯粹博大家一乐,我尽量写的简洁。

首先叙述下算法:

算法维护两个集合,S(已找到从源点v开始的最短路径的点)和Q(未找到从v开始的最短路径的点)。

算法初始时S为空集;Q中,从v到v本身的最短路径的权值为0,其他点均为正无穷。

在算法的每次迭代中,从Q中选择一个权值最小的点u,这个权值即为从v到u的最短路径,并且放入S。同时,遍历u的每个邻接点x,如果从v到u的最短路径加上从u到x的边的权值小于Q中记录的x的权值,则更新x的权值。

(由于实在懒得输入数学公式,哪些说的不清楚的地方还请参考CLRS。)

算法每次迭代找到一个点的最短路径直到S=V、Q为空。

证明:

使用数学归纳法,假设在某次迭代(不是第一次迭代)之前,S中的点的权值都是最短路径,我们证明某次迭代之后从Q中取出的点的权值依然是这个点的最短路径。

利用反正,假设本次迭代从Q中取出的点u的权值不是最短的,那么存在一条从v到u的路径小于这个权值。可知这条路径上u的前趋一定有一个属于S(因为至少v是属于S的),假设属于S的第一个前趋为x,而这条路径上x的后继为y。由算法的性质可知,这条路径从v到y的权值一定是不小于从Q中取出的u的权值的,那么可知刚刚找到的这条从v到u的路径权值也不小于从Q中取出的u的权值。这与假设矛盾。故u的权值是最短的。

而算法第一次迭代也满足从Q中取出的店的权值为最优这个性质,故算法的正确性得证。

时间: 2024-10-14 20:03:15

Dijkstra算法的另一种证明的相关文章

【最短路】求两点间最短路径的改进的Dijkstra算法及其matlab实现

代码来源:<图论算法及其matlab实现>(北京航空航天出版社) P18 书中提出了基于经典Dijkstra算法改进的两种算法. 其中算法Ⅱ的效率较高. 代码如下: 1 function a=Dijk(a) 2 %a(输入量)表示图的邻接矩阵 3 %a(输出量)表示所求最短路径的距离矩阵 4 5 %建立邻接矩阵,若不还是对称矩阵,则变为对称矩阵 6 n=length(a); 7 for i=2:n 8 for j=1:(i-1) 9 a(i,j)=a(j,i); 10 end 11 end 1

最短路径算法——Dijkstra算法

在路由选择算法中都要用到求最短路径算法.最出名的求最短路径算法有两个,即Bellman-Ford算法和Dijkstra算法.这两种算法的思路不同,但得出的结果是相同的. 下面只介绍Dijkstra算法,它的已知条件是整个网络拓扑和各链路的长度. 应注意到,若将已知的各链路长度改为链路时延或费用,这就相当于求任意两结点之间具有最小时延或最小费用的路径.因此,求最短路径的算法具有普遍的应用价值. 下面以图1的网络为例来讨论这种算法,即寻找从源结点到网络中其他各结点的最短路径.为方便起见,设源结点为结

互联网IP合全局路由优化的原则-Dijkstra算法证明

周末继续写东西的一半填补了,为了达到完美的一天.我们知道一个事实,IP地址太多.统一管理是不可能的了,无论从控制平面从数据/管理层表示,飞机是如此. 所以.IP协议被设计为可伸缩.供IP路由术语,跳路由进行计算.当然,支持"源路由",源路由就是说数据在出发前就已经把路线规划好了,逐跳路由是IP路由的标准形式.也就是说.IP数据包是在路上即时规划路线的.       我比較喜欢IP路由是由于这也是我旅行的方式,我喜欢旅行,可是我不喜欢事先订酒店.事先规划路线.导航等,我的方式是在路上看路

互联网IP路由的逐跳全局最优化原则-Dijkstra算法证明

把周末写了一半的东西继续补齐了,实现了完美的一天.我们知道的一个事实就是IP地址实在太多了,根本就不可能统一的管理起来,无论从数据平面还 是从控制/管理平面上说都是这样.所以,IP协议被设计出来就是可扩展的.对于IP路由来讲,路由计算是逐跳进行的,当然也支持"源路由"选项,源路由就 是说数据在出发前就已经把路线规划好了,逐跳路由是IP路由的标准形式,也就是说,IP数据包是在路上即时规划路线的.       我比较喜欢IP路由是因为这也是我旅行的方式,我喜欢旅行,但是我不喜欢事先订酒店,

Dijkstra算法原理及证明(转)

Dijkstra算法及其证明 算法: 设G是带权图,图中的顶点多于一个,且所有的权都为正数.本算法确定从顶点S到G中其他各个顶点的距离和最短通路.在本算法中P表示带永久标记的顶点的集合.顶点A的前驱是P中的一个顶点,用来标记A.顶点U和V之间的边的权重用W(U,V)表示,如果U和V之间没有边,则记作W(U,V)=∞. 步骤1 (对S做标记) (a)将S标记为0,并使S没有前驱 (b)令P={S} 步骤2 (对其他顶点作标记) 将每个不在P中的顶点V标记为W(S,V)(可能是暂时的),并使V的前驱

【裸单源最短路:Dijkstra算法两种版本】hdu 1874 畅通工程续

Source : hdu 1874 畅通工程续 http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束.

Dijkstra 算法

最短路径算法的基础知识,参见 http://blog.csdn.net/pacosonswjtu/article/details/49894021 Dijkstra算法 涉及到的 优先队列的操作实现(该优先队列的数据类型不是 int , 而是 Distance),详情参见http://blog.csdn.net/pacosonswjtu/article/details/49923389 [1]Dijkstra 算法相关 1.1)贪婪算法一般分阶段去求解一个问题, 在每个阶段它都把当前出现的当做是

ACM: HDU 1869 六度分离-Dijkstra算法

HDU 1869六度分离 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即只用6个人就可以将他们联系在一起,因此他的理论也被称为“六度分离”理论(six degrees of se

Dijkstra算法,Floyd算法以及A*算法

Dijkstra算法 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. Floyd算法 Floyd算法是一个经典的动态规划算法.用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径.从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在) 从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点