算法导论复习——CHP25 多源最短路

问题描述        

        给定一个带权重的有向图G=(V,E),其权重函数为ω:E→R。 在图中,对所有的结点对 u,v∈V,找出从结点u到结点v的最短路径。 该问题的解以表格(二维数组)的形式给出:第u行第v列给出从结点u到结点v的最短路径权重。

约定

        1)结点编号:不失一般性,结点编号为1,2,…,|V|。

        2)成本邻接矩阵:图G用一个n╳n的邻接矩阵W=(wij)表示, 其中,

算法导论复习——CHP25 多源最短路_第1张图片

        3)允许存在权重为负值的边,但不能包含权重为负值的环路,否则无解。
        4)最短路径矩阵:算法的输出为一个n╳n的最短路径矩阵 D=(dij),其中dij表示从结点i到结点j的一条 最短路径的权重。算法结束时有dij=δ(i,j)。

        5)前驱结点矩阵: 前驱结点矩阵记为:П=(πij),其中

        利用前驱结点矩阵П可以计算出每对结点间的最短路径。 前驱结点矩阵П的第i行所诱导的子图是一棵根结点为i的最短路径树。 对于每个结点i∈V,定义图G对于结点i的前驱子图为 Gπ,i=(Vπ,i,Eπ,i),其中

算法导论复习——CHP25 多源最短路_第2张图片

        (见CHP24) 

        打印最短路的过程

算法导论复习——CHP25 多源最短路_第3张图片

动态规划做法

最短路径的最优子结构性质

        每条路径都是最短路径:考虑从结点i到结点j的一条最短路径p。假定p至多包含m条边(假定没有权重为负值的环路),且m为有限值。

         如果i=j,则p中不包含任何边,所以p的权重等于0;

        如果i ≠ j,则将路径p分解为 ,其中  p ’至多包含 m-1 条边,则p ’是从i到k的一条最短路径, 且δ(i,j)=δ(i,k)+Wkj。

递归解

        设l_{ij}^{(m)}是从结点i到结点j的至多包含m条边的任意路径中的最小权重。

        则算法导论复习——CHP25 多源最短路_第4张图片

自底向上解 

(伪代码在给定W和L(m-1)的情况下计算L(m))

算法导论复习——CHP25 多源最短路_第5张图片

时间复杂度O(n^4)

发现这个计算过程实际上很类似于矩阵乘法(几乎完全一样),可以用矩阵快速幂优化到O(n^3lgn)

另一种DP——Floyd-Warshall算法

         算法允许图中存在负权重的边,但不能存在权重为负值的环路。

思路

        假定图G的结点集为V={1,2,…,n}。考虑其中的一个子集 {1,2,…,k},这里k是小于n的某个整数,并是其中的最大编号。 对于任意一对结点i,j∈V,定义p是从i到j、且所有中间结点均取自于集合{1,2,…,k}的最短路径。

        p是简单路径,且p的中间结点都不大于k。

        p从i 到 j,仅经过集合{1,2,…,k}中的结点,但,

  •                 不一定经过其中的每一个结点;
  •                 也可能不存在这样的路径,此时p的权重等于∞。

在从 i 到 j 之间中间结点均取自集合{1,2,…,k-1}的基础上,试图回答这样一个问题:结点k是否是路径p上的一个中间结点?

        1)如果结点k不是路径p上的中间结点,则p上的所有中间结点都属于集合{1,2,…,k-1}。  此时,从结点i到结点j的中间结点取自集合{1,2,…,k-1}的一条最短路径也是从结点i到结点j的中间结点取自集合 {1,2,…,k}的一条最短路径。

        2)如果结点k是路径p上的中间结点,则k将路径p分解为两段(如下图),最优子结构性,p1是从结点i到结点k的一条最短路径,且中间结点全部取自集合{1,2,…,k-1} 。 因为结点k不是路径p1上的中间结点,所以路径p1上的所有结点都 属于集合{1,2,…,k-1} 。 同理,p2是从结点k到结点j的一条最短路径,且中间结点全部取自集合{1,2,…,k-1}

故有状态转移方程:

        算法导论复习——CHP25 多源最短路_第6张图片 

伪代码

算法导论复习——CHP25 多源最短路_第7张图片

 时间复杂度O(n^3)

加入最短路径构建

        \pi _{ij}^{(k)}为从结点i到结点j的一条所有中间结点都取自集合 {1,2, …, k}的最短路径上j的前驱结点。

        算法导论复习——CHP25 多源最短路_第8张图片 

应用——计算传递闭包 

        定有向图G=(V,E),定义图G的传递闭包G*=(V,E*),其中 E*={(i,j):如果图G中包含一条从结点i到结点j的路径}。

        求有向图的传递闭包: 方法一:给E中每条边赋权重1,然后运行FLOYD-WARSHALL算法, 可以在Θ(n3)求出权重路径矩阵D。在D中若dij

        方法二:定义矩阵T ={tij},若存在一条从结点i到结点j的路径,tij=1,否则tij=0。
                        计算T:
                                对FLOYD-WARSHALL算法进行改造:用逻辑或操作(V)和
                        逻辑与操作(Λ)替换算术操作min和+,得以下计算公式:

算法导论复习——CHP25 多源最短路_第9张图片

用于稀疏图的Johnson算法

        Johnson算法:在稀疏图中求每对结点之间的最短路径权重。

        对稀疏图,Johnson算法优于Floyd-Warshall算法,时间复杂度可达O(V2lgV+VE)。

        Johnson算法使用Dijkstra算法和Bellman-Ford算法作为自己的子程序,可处理带有负权重的图。

        如果图中包含所有结点对的最短路径,Johnson算法输出一个包含所有结点对的最短路径权重矩阵;否则报告图中包含权重为负值的环路。

        重赋权重:Johnson算法使用重新赋予权重的技术求解。

你可能感兴趣的:(算法导论,算法,数据结构)