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中取出的店的权值为最优这个性质,故算法的正确性得证。
Dijkstra算法的另一种证明的更多相关文章
- 最短路径算法——Dijkstra算法
在路由选择算法中都要用到求最短路径算法.最出名的求最短路径算法有两个,即Bellman-Ford算法和Dijkstra算法.这两种算法的思路不同,但得出的结果是相同的. 下面只介绍Dijkstra算法 ...
- AI贪吃蛇前瞻——基于Dijkstra算法的最短路径问题
在贪吃蛇流程结构优化之后,我又不满足于亲自操刀控制这条蠢蠢的蛇,干脆就让它升级成AI,我来看程序自己玩,哈哈. 一.Dijkstra算法原理 作为一种广为人知的单源最短路径算法,Dijkstra用于求 ...
- 互联网IP合全局路由优化的原则-Dijkstra算法证明
周末继续写东西的一半填补了,为了达到完美的一天.我们知道一个事实,IP地址太多.统一管理是不可能的了,无论从控制平面从数据/管理层表示,飞机是如此. 所以.IP协议被设计为可伸缩.供IP路由术语,跳路 ...
- 最短路径——Dijkstra算法以及二叉堆优化(含证明)
一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...
- Dijkstra算法原理及证明(转)
Dijkstra算法及其证明 算法: 设G是带权图,图中的顶点多于一个,且所有的权都为正数.本算法确定从顶点S到G中其他各个顶点的距离和最短通路.在本算法中P表示带永久标记的顶点的集合.顶点A的前驱是 ...
- ACM: HDU 1869 六度分离-Dijkstra算法
HDU 1869六度分离 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descri ...
- Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32824 Accepted: 11098 Description Bes ...
- [图论]Dijkstra 算法小结
Dijkstra 算法小结 By Wine93 2013.11 1. Dijkstra 算法相关介绍 算法阐述:Dijkstra是解决单源最短路径的算法,它可以在O(n^2)内计算出源点(s)到图中 ...
- dijkstra算法(迪杰斯特拉算法)
dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...
随机推荐
- 【剑指offer】二叉树的子结构,C++实现(递归)
原创博文,转载请注明出处! <牛客链接> 1.题目 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:约定空树不是任意一个树的子结构) 图1.二叉树A和二叉树B 2.思路(递归) ...
- C语言中库函数strstr的实现
在C语言中库函数strstr()函数表示在一个字符串str1中查找另一个字符串str2,如果查到则返回str2在str1中首次出现的位置,如果找不到则返回null. char* strstr(char ...
- A Corrupt Mayor's Performance Art
Corrupt governors always find ways to get dirty money. Paint something, then sell the worthless pain ...
- python 正则表达式字符说明
. 元字符 说明 . 代表任意字符 | 逻辑或操作符 [ ] 匹配内部的任一字符或子表达式 [^] 对字符集和取非 - 定义一个区间 \ 对下一字符取非(通常是普通变特殊,特殊变普通) * 匹配前面的 ...
- JavaScript for 循环累加 json 字符串
var msg = {"status":1,"data":[{"id":"12","words":& ...
- PF不明内存泄露已解决,白头发也没了(转)
在使用OpenExpressApp进行WPF应用开发过程中遇到多个内存泄漏的地方,在上一篇中求助了一个内存泄露问题[WPF不明内存泄露原因,头发都白了几根],本篇与大家分享一下如何解决此问题的过程. ...
- 制作Windows XP万能克隆镜像
制作Windows XP万能克隆镜像 战前分析:对于Windows XP,制作万能克隆时的一个重要问题就是系统激活,因为Windows XP为了防止盗版,采取了激活机制,当硬件发生改变时,系统就会要求 ...
- Oracle 之 Cloning $oracle_home (克隆安装oracle软件)
用途:Cloning an Oracle Home , 可以免去多台机器重复安装oracle软件 1.停止相关进程[root@node1 bin]# ./crsctl stop cluster -al ...
- Spark的CombineByKey
combineBykey关键是要明白里面的三个函数: 1. 当某个key第一次出现的时候,走的是第一个函数(createCombin):A function that creates a combin ...
- 通过修改注册表建立Windows自定义协议
引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...