本节就之前给出的一部分性质进行严密的证明,而非通过“显然”等模糊的语句。

1、三角不等式性质

引理10:设G = ( V,E)为一个带权重的有向图,其权重函数 w :E→R,其源节点为s。那么对于所有边(u, v)∈E,我们有:

δ(s, v) ≤ δ(s, u) + w(u, v)

证明:假定 p 是从 s 到结点 v 的一条最短路径,则 p 的权重不会比任何从s 到 v 的其他路径的权重大,不过我们在此处特指了由s到u再到v的一条路径。

2、最短路径估计值的松弛效果

引理11:(上界性质)设G = (V,E)为一个带权重的有向图,权重函数 w : E→R,其源节点为s,并由Initialize_Single_Source(G, s)初始化,那么对于所有结点 v ∈V,v.d ≥ δ(s, v),并且该不等式在对图的边进行任何次序的松弛过程中保持成立,且:v.d取得下界δ(s, v)时,将不再发生变化。

证明:我们使用归纳法。

1、基础步骤:在初始化后,对所有结点 v ∈ V,v.d ≥ δ(s, v)显然成立。因为 v.d = ∞ 意味着所有的结点 v ∈V - {s},v.d ≥ δ(s, v),对于源节点,我们单独考虑:若 s 在一个权重为负值的环路上,那么δ(s, s) = -∞,否则为0.这一位置 s. d = 0 ≥ δ(s, s)必然成立。

2、归纳步骤: 考虑对边(u, v)的松弛操作。根据归纳假设,在松弛前,对所有 x ∈ V,我们有x.d ≥ δ(s, v)。而在对边(u, v)进行松弛操作的过程中,唯一可能发生改变的d值仅有v.d,如果该值发生改变,有:

v. d = u. d + w(u, v) ≥ δ(s, u) + w(u ,v) ≥ δ(s, v)(三角不等式)即得到维持。

3、最终,在v. d = δ(s, v)时,注意它达到其取值的下界后, v.d 无法减小,因为刚刚证明了 v.d ≥ δ(s, v)——而松弛操作是对当发现一条权值相对较少的路径时,才将其更替为v.d。松弛操作不增加d值——因此将不会发生变化。

3、推论12(非路径性质):给定一个带权重的有向图G=(V,E),权重函数为 w:E→R,假定从源节点 s ∈V 到给定结点 v ∈ V 之间不存在路径,则在该图由Initialize_Single_Source(G, s)算法进行初始化后,我们有 v.d = δ(s, v) = ∞,并且该等式作为不变式一直维持到图G所有松弛操作结束。

证明:根据上界性质,我们总有v.d ≥ δ(s, v) = ∞(注意,此处δ(s, v) = ∞ 为已知量。)因此 v.d = δ(s, v) = ∞。

4、引理13:设G = (V,E)为一个带权重的有向图,权重函数w:E→R,且边(u, v)∈E,那么在对边(u, v)进行Relax(u, v, w)后,有v.d ≤ u.d + w(u, v)。

证明:若在松弛前,我们有 v.d > u.d + w(u, v),那么在松弛后, v. d = u.d + w(u, v)。

同时,若在松弛后,我们有v. d ≤ u. d + w(u, v),那么松弛后,其值仍然不会发生改变。

5、引理14(收敛性质) 设G = (V,E)为一个带权重的有向图,权重函数 w:E→ R。设 s ∈V为某个源节点,s -> u→v为图中的一条最短路径,其中u, v∈V。假定图G由Initialize_Single_Source(G, s)初始化,并在其之后进行了一系列的松弛操作,其中包括对边(u, v)的松弛操作Relax(u, v, w),若在松弛前有u. d = δ(s, u),那么在松弛后,v.d = δ(s, v)。

证明:根据上界性质,u.d = δ(s, u)将不会发生变化。同时,在松弛边(u, v)时,发生:

v. d ≤  u. d + w(u, v) = δ(s, u) + w(u, v) = δ(s, v)(最短路径的最优子结构),同时再根据上界性质,其也会保持不变。

6、引理15(路径松弛性质):设G = (V,E)为一个带权重的有向图,权重函数w:E→R,设 s ∈ V 为某个源节点,考虑从 s 到Vk 的一条最短路径p = <V0, V1,……, Vk>,若图由Initialize_Single_Source(G, s)初始化,并进行了一系列的松弛操作,其中按顺序对边(V0, V1), (V1, V2),……, (Vk-1, Vk),那么在进行了这些松弛操作后,我们有 Vk. d = δ(s, Vk),并一直保持不变,该性质与对其他边的松弛操作无关。

证明:根据最优子结构和上界性质进行证明:书上还用到了归纳假设法:假设最短路径p在第i条边被松弛之后,有Vi.d = δ(s, Vi)。

则在基础步:i = 0时,显然 V0. d = s. d = δ(s, s) = 0 假设成立,同时s.d将在这之后不会发生变化。

在归纳步:根据最短路径的最优子结构,从在V0到Vi的最短路径上,V0到Vi-1也是一条最短路径。同时我们已经有Vi-1.d =δ(s, Vi-1),同时根据收敛性质,在对边(Vi-1, Vi)进行松弛后,我们有Vi.d = δ(s, Vi),并在这之后不会发生变化。即得到证明。

松弛操作和最短路径树

引理16:设G=(V,E)为一个带权重的有向图,权重函数 w:E→R,设 s ∈V为某个源节点,假定G不包含从源节点s可以到达的权重为负值的环路,则在图G由Initialize_Single_Source(G, s)算法初始化之后,前驱子图Gp形成根节点为源节点s的有根树,并且任何对图G的边的任意松弛操作将维持该性质不变。

证明:在初始化时,Gp中的唯一结点为 s。引理显然成立。现在考虑经过一系列松弛操作后的前驱子图Gp。

笔者注:以下关于无环路的证明与书上给出的方法不同,是因为我觉得书上的方法不太严谨——它相加了状态不统一的结点的d值,并相消掉。(即对边松弛前后)

首先,先证明Gp无环路:假定在松弛序列的某个步骤上在图Gp创建了一个环路 c =<V0, V1, ……, Vk>,其中有V0 = Vk,那么Vi.p  = Vi-1。同时,假定在对边(Vk-1, Vk)进行松弛操作时创建了该环路。

在这之前,我们需要得知:所有环路上的结点都能从源节点s到达。——在进入环路时,必然V0需要一个前驱结点来到达,从而便能到达整个环路。根据这个信息,我们有结论:Vi.d < ∞。

之后,我们试图证明c是一个权重为负值的环路,从而说明环路本身不存在。

在松弛边(Vk-1, Vk)之前,除了Vk-1和Vk,在环路上的其他结点,我们均有:Vi.p = Vi-1。因此,我们考虑对它们的松弛操作——在对它们进行松弛操作的时候,才会发生p的修改,而此时同时发生的还有对Vi.d的修改,并使得它:

Vi.d = Vi-1. d + w(Vi-1, Vi)。同时,在对这条边进行松弛操作前,我们有:Vi.d > Vi-1.d + w(Vi-1, Vi)。

同样的,在松弛最后一条边(Vk-1, Vk)前,我们也有:Vk.d > Vk-1.d +w(Vk-1, Vk)。然而,我们考虑在松弛边(Vk-1, Vk)前,从Vk以V0的身份依次经过V1、……最后到达Vk-1的路径:在之前,由于我们更新了除V0外每个结点的p值,这表明在更新后,我们有:Vk-1.d =Vk-2.d + w(Vk-2, Vk-1) = Vk-3.d+w(Vk-3, Vk-2) + w(Vk-2, Vk - 1) = V0.d + w(V0, V1) + w(V1, V2) + …… + w(Vk-2, Vk - 1)

在松弛最后一条边(Vk-1, Vk)时,我们有 Vk.d > Vk-1.d + w(Vk-1, Vk)。带入上式,有:

Vk.d > V0.d + w(V0, V1) + w(V1, V2) + ……+ w(Vk-1, Vk)。

其中,Vk.d和V0.d在对边(Vk, Vk-1)进行松弛前相等——因为仅在对边(u, v)进行松弛时它才发生改变。同时,消去该值后,我们右边所得的便是整个环路的总权重——得到的结果为负值。因此得出矛盾,即环路不存在。

现在我们拥有了图Gp是一个有向无环图的结论。为证明其形成一棵根节点为s的有根树,只需证明对 v ∈Vp,在Gp中存在一条从源节点s到达v的简答路径路径。

证明如下:由于Vp中仅包含具有非空p值的结点,因此,再加上结点s,同时,在图Gp中,边Ep中仅包含(v.p, v)——即表示它是由结点的p属性诱导的边的集合。因而从源节点发出的边递归,我们便得到一个能包含所有具有非空p值的点的图。然而,我们可以看到,它仅证明了简单路径的存在,并未证明唯一性。现在又需证明其唯一性:

若在图Gp中,从源节点s到达某个节点v具有两条简单路径,那么这两条路径上必然会在最后回归到一条路径上(当然,也可能是直接回归到结点v),我们假设回归的这个结点为u,那么我们会显然的发现bug:u同时具有两个u.p属性——这明显是不可能的。在松弛操作中,必然会比较这两个u.p的d属性,并选择其中一个作为u结点唯一的p属性,并因此得到证明。

有了这么多基础,我们终于可以回到最初我们想要证明的东西:在执行了一系列的松弛操作后,所有结点都取得了其最后的最短路径权重,则Gp为一棵最短路径树。

引理17:(前驱子图性质)设G = (V,E)为一个带权重的有向图,权重函数 w :E→R,设s∈V为源节点,假定图G不包含从s可以到达的权重为负值的环路。假定调用Initialize_Single_Source(G, s)对图进行初始化,然而对图G的边进行任意次序的松弛操作。该松弛操作序列将针对所有结点v∈V生成的v.d = δ(s, v),则前驱子图Gp形成一棵根节点为s的最短路径树。

证明:我们先回到最短路径树的定义:

一棵根节点为s的最短路径树是一个有向子图G' = (V', E'),其中V' ∈ V,E' ∈ E,满足:

1、V' 是图G中从源节点 s 可以到达的所有结点的集合。

2、G' 形成一棵根节点为 s 的树。

3、对于所有结点 v ∈ V',图G’中从结点 s 到结点 v 的唯一简单路径是图G中从结点 s 到结点 v的一条最短路径。

对性质1:在上述中,我们已经得知了在集合Vp中的结点的d 是有限值,且它们可被到达。而根据上界定理,δ(s, v) ≤ v.d,因此δ(s, v)有限,从而我们得到它是可从源节点s到达的。

对性质2:可直接由引理16导出。

对性质3:对结点v来说,其属性p和d是相关联——p的选择为其相对较短路径上的前驱结点,而若考虑对所有边进行松弛,那么会选择比较所有路径上的最短路径的前驱结点,即得到证明。

(注:详细的证明见书394页)

单源最短路径:最短路径性质的证明相关推荐

  1. java 迪杰斯特拉_Java 实现Dikstra迪杰斯特拉算法 关于单源顶点最短路径问题的求解...

    Dijkstra算法是按照路径长度递增的方法计算某一点到其余各顶点的最短路径.其算法的基本思想是:把图中所有顶点分成两组,第一组包括已确定最短路径的顶点(初始只包括源点v0),第二组包括尚未确定最短路 ...

  2. 单源顶点最短路径java_单源最短路径-Dijkstra 算法

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问题:求a点到各个点的最短距离,如下图 ...

  3. 算法导论之单源最短路径

    单源最短路径,在现实中是很多应用的,是图的经典应用,比如在地图中找出两个点之间的最短距离.最小运费等.单源最短路径的问题:已知图G=(V,E),找出给定源顶点s∈V到每个顶点v∈V的最短路径.单源最短 ...

  4. CUDA编程实现求解单源Bellman-Ford最短 路径算法

    初始化:源节点到自己的距离为0,到其他节点的距离为∞: 对于源节点的 邻接节点 ,比较 从源节点加上边的和 与其 本身距离 的值,若小,则更新.以此类推, 循环 V - 1 次(即节点数减1次). 最 ...

  5. java 有向图 最短路径算法_java使用Dijkstra算法实现单源最短路径

    单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径.在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质. 一.最短路径的最优子结构性质 该性质描述为:如果P(i,j) ...

  6. Dijkstra算法(单源最短路径)

    对于有向无环图DAG,我们可以利用先拓扑排序得到顶点的一个序列,然后按照此序列进行最短路径的推进(更新当前顶点的邻接顶点的dist值),如 图的邻接表数组实现及其应用 对于有环图,通常使用的是Dijk ...

  7. 图论(单源最短路径)

    一.基础 1.最短路径问题的形式: 单源最短路径:希望找到从源节点s到每个结点的最短路径: 单目的地最短路径:希望找到从每个结点到给定目的地的最短路径,只需将图的每条边方向翻转过来,就可以转化成单源最 ...

  8. 单源最短路径问题(Java)

    单源最短路径问题(Java) 文章目录 单源最短路径问题(Java) 1.问题描述 2.算法思路 3.代码实现 4.算法正确性和计算复杂性 4.1 贪心选择性质 4.2 最优子结构性质 4.3 计算复 ...

  9. 算法导论-上课笔记11:单源最短路径

    文章目录 0 前言 0.1 最短路径的几个变体 0.2 最短路径的最优子结构 0.3 负权重的边 0.4 环路 0.5 最短路径的表示 0.6 松弛操作 0.7 最短路径和松弛操作的性质 1 Bell ...

最新文章

  1. 香蕉派安装64位linux,在香蕉派里安装配置archlinux到树莓派
  2. [Web开发] 在网页中动态加入RSS feed 元素
  3. 【详细分析】1023 Have Fun with Numbers (20 分)_20行代码AC
  4. python基础文档_python基本文件操作
  5. CCF201412-2 Z字形扫描(100分)
  6. 2021湖南高考成绩分段查询,2021年湖南高考成绩排名查询系统,湖南高考位次排名查询...
  7. Flink-sql之当前日期
  8. matlab 图片显示函数,matlab图像显示函数
  9. Java面向对象编程之三大特性
  10. linux基础(十四)定时任务和管理系统的临时文件
  11. 提供计算机网络通信功能,在计算机网络中,通信子网的主要作用是___ 答案:提供计算机网络的通信功能...
  12. 老外的一份渗透测试报告
  13. uniapp路线规划
  14. 大数据可视化(六)文本数据可视化
  15. 【杂谈】当你在凝视深渊的时候,深渊也正在凝视着你
  16. 查找谷歌浏览器中的Internet选项
  17. 【Linux】写实拷贝、父子进程间数据共享以及僵死进程
  18. 微信域名防封,微信网址域名防封的几种方法
  19. Linux命令curl详解(一)
  20. CentOS7下载安装nginx

热门文章

  1. 按照题目打印菜单c语言,--单片机C语言编程实训
  2. comsol学习中心:定义与材料选择
  3. xxd航模电调电路图
  4. MPAndroidChart的详细使用——BarChart条形图组(三)
  5. STM32外部中断总结
  6. MFC 的CList,CPtrList,CObList,CStringList 的用法之CList
  7. php取FBOX数据,云平台制作(1)-OPC Client取数模块的制作
  8. 建筑央企工程项目数字化管理整体解决方案
  9. vscode中添加好看字体的方法
  10. 中国电子学会2022年06月份青少年软件编程Python等级考试试卷一级真题(含答案)