Shortest paths(II)

本文深入探讨了计算图中所有对最短路径的两种经典算法:Floyd-Warshall算法和Johnson算法。Floyd-Warshall算法利用动态规划求解,通过迭代更新所有节点对之间的最短路径。Johnson算法则通过重新赋予权重解决含有负权边的图的最短路径问题。这两种算法的时间复杂度分别为O(n^3)和O(n^2logn)。
摘要由CSDN通过智能技术生成

Topics:

  • All-pairs shortest paths
  • Floyd-Warshall algorithm
  • Johnson’s algorithm

Shortest paths
在这里插入图片描述

All-pairs shortest paths

在这里插入图片描述
Dynamic programming
在这里插入图片描述
在这里插入图片描述
Proof of claim
在这里插入图片描述
Matrix multiplication
在这里插入图片描述
在这里插入图片描述
最后的矩阵L(n-1)包含的是最短路径的实际权重。L(1)=W。L(m)=(lij(m))。
该算法的核心伪代码如下,该伪代码可以在给定W和L(m-1)的情况下,计算出L(m)。也就是说,该伪代码将最近计算出的最短路径扩展了一条边。
在这里插入图片描述
该过程计算在算法结束时返回的矩阵L’=(l’ij)。使用L作为L(m-1),L’作为L(m)。时间复杂度:Θ(n^3)。
在这里插入图片描述
快速方法使用了重复平方技术。

An Example
在这里插入图片描述
在这里插入图片描述

Floyd-Warshall algorithm

在这里插入图片描述
Floyd-Warshall recurrence
在这里插入图片描述
Pseudocode for Floyd-Warshall
在这里插入图片描述

const int n=16;//图的节点数
int dest[n][n];
int value[n][n];
//使用动态规划,最优子结构为:
//Graph[i][j] =min(dest[i][j], dest[i][k] +dest[k][j])
void Floyd(int dest[][n])
{
    for(int k=0;k<n;k++)
       for(int i=0;i<n;i++)
           for(int j=0;j<n;j++)
           {
               if(i!=j&&j!=k&&i!=k)
               {
                   if(dest[i][j]>dest[i][k]+dest[k][j])
                   {
                       dest[i][j]=dest[i][k]+dest[k][j];
                       value[i][j]=k;
                   }
               }
           }
}

Transitive closure of a directed graph(有向图的传递闭包)
在这里插入图片描述

Johnson’ algorithm

Johnson算法使用的技术称为重新赋予权重

Graph reweighting
Theorem:
在这里插入图片描述
那么,对于任意两个顶点,它们之间的所有路径都是按相同数额重新加权。
在这里插入图片描述
第三个式子由裂项相消获得。

Shortest paths in reweighted graphs
在这里插入图片描述
算法如下:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值