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
算法如下: