(THIS BLOG WAS ORIGINALLY WRTITTEN IN CHINESE WITH LINK: http://www.cnblogs.com/waytofall/p/3732920.html)

Foreword: Floyd-Warshall is a classical dynamical programming algorithm for deriving shortest paths between each pair of nodes on a graph. It has n iterations (n for the number of nodes). During each iteration k,  the shortest paths for each pair of nodes with intermediate nodes numbered no more than k are derived. Since inductively, we can assume that before iteration k, the shortest paths for each pair of nodes with intermediate nodes numbered no more than k-1 are derived, the way to derive the paths with intermediate nodes numbered no more than k can be derived as:

In order to derive all the intermediate nodes on a shortest path, the algorithm maintains a predecessor matrix Π, with its element  πij denoting the node before j in the shortest path from i to j. The matrix is defined as follows:

​For more detailed specification, please refer to Introduction to Algorithms.

My problem:  for two nodes i, j of graph, there is a maximal k, such that during the kth iteration, the shortest paths dynamically programmed by the algorithm was combined by shortest paths i ~ kk ~ j, whose intermediate nodes are numbered less than k. And for the shortest paths i ~ kk ~ j, we can also have such a iteration. Therefore, the path can be visualised as follows:

​In the tree displayed above, each parent is separated by the "middle node" k, which is the maximal number of iteration that combines two paths. The shortest paths derived from the predecessor matrix are easily proved correct, but the problem is, whether the paths derived by such methods are identical to the paths displayed by the figure above? In another word, whether the paths derived demonstrate the hierarchical path construction process of Floyd-Warshall? The answer is yes. And I'm gonna prove it.

Lemma 1: If, during the kth iteration, the shortest path from i to j was derived by combining paths i ~ k, k ~ j, and we have m = πij(kand m ≠ k; then the shortest path constructed by the algorithm from i to m also are derived from combining i ~ k,  k ~ m.

Proof: Since πkj(k-1) = πij(k)= m, that is, in the path from k to j with intermediate nodes numbered no more than k, the predecessor of j is m, so we have:

                               dkj(k-1) = dkm(k-1) wmj 

wmj is the weight for edge(m, j).

Since there is an edge from m to j, from the Triangle Inequality, we have:

dij(k-1) ≤ dim(k-1) wmj                                                                          (1)

which is:

dim(k-1)  ≥  dij(k-1) wmj                                                                         (2)

From the condition of the lemma, we have:

                                dij(k-1) dik(k-1) dkj(k-1)                                                                      (3)

Subtract wmj from both sides, we have:

                                dij(k-1)  - wmj  dik(k-1) dkj(k-1)  wmj =  dik(k-1) dkm(k-1)                 (4)

Which can be transformed to:

dij(k-1)  - wmj  dik(k-1) dkm(k-1)                                                          (5)


Combining (2) and (5), we have:

                                dim(k-1)dik(k-1) dkm(k-1)                                                                   (6)

Done.

Then we are going to prove our conclusion.

Proof:  We use mathematical induction. Before the first iteration, the paths derived from the Π(0) matrix certainly meet the property.

Then, supposing that path derived from Π(k-1) meet the property, then in the kth iteration:

(1). If the shortest path from i to j does not contain node k, we have  dij(k) = dij(k-1),πij(k) = πij(k-1) = m. Applying the shortest path construction function, we can have a nodes sequence:

πij(k) = m

πim(k) = n

...

πio(k) = p

πip(k) = i

For any  πix(k) (x belongs to {m,n,...,p,i}), πix(k) ix(k-1). So we have:

πij(k) = πij(k-1) = m

πim(k) = πim(k-1) = n

...

πio(k) = πio(k-1) = p

πip(k) = πip(k-1) = i

That is, the shortest paths derived from Π(k) is identical to the shortest paths derived from Π(k-1). Since Π(k) has the propery, the path also has the property.

(2). If the shortest path from i to j contains node k, we have:

           dij(k) = dik(k-1) dkj(k-1),πij(k) = πkj(k-1)= m

and:

πij(k) = πkj(k-1) = m

πim(k) = πkm(k-1) = n

...

πio(k) = πko(k-1) = p

πip(k) = πkp(k-1) = k

That is, we enumerate the predecessor of j until we get to k. Now, all the intermediate nodes of the path from i to k are identical to the path derived from Π(k-1), so the subpath meet the property. The same for path from k to j, so the shortest paths from i to j derived from Π(k) meet the property.

Done.

Proof for Floyd-Warshall's Shortest Path Derivation Algorithm Also Demonstrates the Hierarchical Path Construction Process的更多相关文章

  1. 图论之最短路径(1)——Floyd Warshall & Dijkstra算法

    开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...

  2. SPFA(Shortest Path Faster Algorithm)

    特别说明 本文转载自三金(frinemore)的博客: 点这 前言 1.关于SPFA,它没死. 2.接下来的所有代码,都是自己手写的(未检查正确性,补充的代码有检查过,是对的),有错误请帮忙指出. S ...

  3. 安装vmware-tools遇the path "" is not valid path to the gcc binary和the path "" is not a valid path to the 3.10.0-327.e17.x86_64 kernel headers问题解决

    #./vmware-install.pl踩点: 1.the path "" is not valid path to the gcc binary 2.the path " ...

  4. 安装vm tools时出现如下问题 The path "/usr/bin/gcc" is not valid path to the

    sudo suapt-get updateapt-get dist-upgradeapt-get install open-vm-tools-desktop fusereboot https://bl ...

  5. os.path.join合并 os.path.dirname返回上一级目录 os.path.exists(path) os.stat('path/filename')获取文件/目录信息

    import os str1 = "grsdgfd" str2 = "wddf" str3 = "gddgs" # print(str1 + ...

  6. zk 09之:Curator之二:Path Cache监控zookeeper的node和path的状态

    在实际应用开发中,当某个ZNode发生变化后我们需要得到通知并做一些后续处理,Curator Recipes提供了Path Cache 来帮助我们轻松实现watch ZNode. Path Cache ...

  7. os.path.dirname(__file__)使用、Python os.path.abspath(__file__)使用

    python中的os.path.dirname(__file__)的使用 - CSDN博客https://blog.csdn.net/u011760056/article/details/469698 ...

  8. Floyd —Warshall(最短路及其他用法详解)

    一.多元最短路求法 多元都求出来了,单源的肯定也能求. 思想是动态规划的思想:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设Dis(A ...

  9. 图论学习笔记·$Floyd$ $Warshall$

    对于图论--虽然本蒟蒻也才入门--于是有了这篇学习笔记\(qwq\) 一般我们对于最短路的处理,本蒟蒻之前都是通过构建二维数组的方式然后对每两个点进行1次深度或者广度优先搜索,即一共进行\(n\)^2 ...

随机推荐

  1. [CSAPP笔记]Binary , Unsigned , Signed 之间的相互装换

    LaTex+MarkDown+Pandoc组合套件写博客的处女作,试试效果.各自的分工为:Latex下编辑公式,在Sublime Text 2下使用Markdown排版,最后用Pandoc导出. 摘要 ...

  2. Percona 工具 pt-query-digest的使用

    pt-query-digest说明 pt-query-digest 用来格式化分析MySQL产生的日志,如:慢查询日志.二进制日志.通用日志,根据不同的条件进行分析并生成报告. pt-query-di ...

  3. 内联汇编实现 memcpy 和 memset

    #pragma check_stack( off) LPVOID __cdecl _memcpy(void * dst, void* src, size_t size) { int dwSize = ...

  4. hadoop常见错误汇总及解决办法一

    我们经常会遇到一些问题,而且可能会重复性遇到,这些方案可以收藏为以后备用.我们经常遇到如下问题:1.两次以上格式化造成NameNode 和 DataNode namespaceID 不一致,有几种解决 ...

  5. idea 创建Java WEB 项目

    第一步 FILE - New Project 写上名字,然后 点  Finish 这里特别注意,不懂路径 那么 就点上 inherit 再点下面 让他默认 加载你的 web 路径 选择 Jar包 , ...

  6. 隐藏控件HiddenField使用

    HiddenField控件顾名思义就是隐藏输入框的服务器控件,它能让你保存那些不需要显示在页面上的且对安全性要求不高的数据. 增加HiddenField,其实是为了让整个状态管理机制的应用程度更加全面 ...

  7. SpringMvc的上传和下载

    第一步:配置文件加入上传和下载的<bean>全部配置文件参考上上篇博文 <!-- 配置springMVC上传文件和下载文件 --> <bean id="mult ...

  8. python 之 list,tuple,dict,set

    基本类型,  其中set好像提到的很少 list : []  根据字面, 是一个列表,  所以有序, 可以通过序号方位 tuple: ()  是不变的list, 通过序号访问 dict: {},  字 ...

  9. Windows下安装Redis服务,修改查看密码,修改端口,常用命令

    一.安装 出自:https://jingyan.baidu.com/article/0f5fb099045b056d8334ea97.html 1.要安装Redis,首先要获取安装包.Windows的 ...

  10. WPF自适应可关闭的TabControl 类似浏览器的标签页(转)

    效果如图: 虽然说是自适应可关闭的TabControl,但TabControl并不需要改动,不如叫自适应可关闭的TabItem. 大体思路:建一个用户控件,继承自TabItem,里面放个按钮,点击的时 ...