算法设计与分析课程复习笔记12——全点对最短路径

全成对最短路径

输入:有向图G=(V,E), 权函数w,
计算:图中任何点对之间的最短距离
结果表示: n × n矩阵, 元素是对应的点对之间的最短距离δ(u, v)

解决方案:

  • 对于每一个顶点, 运行BELLMAN-FORD(单源最短))
    计算开销: O(V2E), 甚至O(V4):对于边稠密的图
  • 如果不存在负权值边, 可利用Dijkstra’s算法计算单源最短
    计算开销:O(VElgV), 甚至O(V3lgV):对于边稠密的图
  • 可以设计O(V3)开销的全成对最短路径算法,且不需要特殊的数据结构

最短路径的优化结构

  • 最短路径的部分路径必然是最短的
  • p是从i到j至多含有m条边的最短路径
    if i = j ,w(p) = 0
    if i ≠ j , p = i ~(p’)k→j,p’最多有m-1条边,p’也是最短路径
    δ(i, j) = δ(i, k) + wkjw_{kj}

递归解
lij(m)l_{ij}^{(m)}:从i到j至多含有m条边的最短路径的权
m=0, lij(0)l_{ij}^{(0)}=0,if i =j; lij(0)l_{ij}^{(0)}=\infty,if i ≠j。
m\geq 0,lij(m)l_{ij}^{(m)} = min1kn{lik(m1)+wkj}min_{1≤k≤n}\{l_{ik}^{(m-1)}+w_{kj}\}

计算最短路径
m=1:lij(1)l_{ij}^{(1)}=wijw_{ij},L(1)L^{(1)}=W
给出W = (wijw_{ij}), 计算L(1),L(2),,L(n1)L^{(1)}, L^{(2)}, …, L^{(n-1)}
L(n1)L^{(n-1)}包含最短路径
计算过程:给出L(m1)L^{(m-1)}和W,计算L(m)L^{(m)}
如果没有负权回路, 所有的最短路径至多含有n -1条边, 因此有
δ(i, j) = lij(n1)l_{ij}^{(n-1)}and lij(n)l_{ij}^{(n)},lij(n+1)l_{ij}^{(n+1)}……=lij(n1)l_{ij}^{(n-1)}

延伸算法
Extend(L,W,n)
 create L’, an n*n matrix
 for i ← 1 to n
  do for j ← 1 to n
    do lijl_{ij}'\infty
     for k ← 1 to n
      do lijl_{ij}' ← min(lijl_{ij}',likl_{ik}+wkjw_{kj})
 return L’

运行开销:Θ(n3)Θ(n^3)

成对最短路径算法(慢速)
SLOW-ALL-PAIRS-SHORTEST-PATHS(W,n)
 L(1)L^{(1)} ← W
 for m ← 2 to n-1
  do L(m)L^{(m)} ← Extend(L(m1)L^{(m-1)},W,n)
 return L(n1)L^{(n-1)}

运行开销:Θ(n4)Θ(n^4)

例如给定W,先计算L(1)L^{(1)}=W,则L(m1)L^{(m-1)}=L(1)L^{(1)},接着由L(m1)L^{(m-1)}和W计算L(m)L^{(m)}=L(2)L^{(2)},以此类推,直到计算出L(4)L^{(4)}
算法设计与分析课程复习笔记12——全点对最短路径
改进运行时间

  • 不必计算所有L(m)L^{(m)}
  • 如果没有负回路, 则有:L(m)L^{(m)}=L(n1)L^{(n-1)} for all m \geqn-1
  • 通过计算以下序列:L(1)L^{(1)}=W,L(2)L^{(2)}=W2=W*W,L(4)L^{(4)}=W4=W2*W2,L(8)L^{(8)}=W8=W4*W4

L(n1)L^{(n-1)}=W2lg(n1)W^{2^{\lceil lg(n-1)\rceil}}

快速算法FASTER-APSP(W, n)
 L(1)L^{(1)} ← W
 m ← 1
 while m < n-1
  do L(2m)L^{(2m)} ← Extend(L(m)L^{(m)},L(m)L^{(m)},n)
   m ← 2m
 return L(m)L^{(m)}

运行开销:Θ(n3lgn)Θ(n^3lgn)

Floyd-Warshall 算法
给定:G(V,E),可以存在负权边,但不能存在负权回路。
计算:点对之间的最短距离

最短路径结构
对于任何点对i和j, 考虑所有从i到j的路径, 这些路径的中间节点来自集合{1, 2, …, k}
dij(k)d_{ij}^{(k)}:从i到j的路径的权值, 中间节点来自集合{1, 2, …, k} )

例如:
算法设计与分析课程复习笔记12——全点对最短路径
如果顶点k不是路径p的中间节点,则从i到j的中间节点来自{1, 2, …,k}的最短路径即是从i到j的中间节点来自{1,2, …, k - 1}的最短路径。
如果顶点k是路径p的中间节点,则p1p_1是i到k的最短路径,p2p_2是k到j的最短路径,k不是p1p_1p2p_2的中间节点,p1p_1p2p_2是最短路径。

递归解
k=0,dij(k)d_{ij}^{(k)}=wijw_{ij}
k\geq 1,顶点k不是路径p的中间节点,dij(k)d_{ij}^{(k)}=dij(k1)d_{ij}^{(k-1)}
顶点k是路径p的中间节点,dij(k)d_{ij}^{(k)}=dik(k1)d_{ik}^{(k-1)}+dkj(k1)d_{kj}^{(k-1)}

最终解:D(n)D^{(n)}=(dij(n)d_{ij}^{(n)})

FLOYD-WARSHALL(W)
 n ← rows[W]
 D(0)D^{(0)} ← W
 for k ← 1 to n
  do for i ← 1 to n
    do for j ← 1 to n
      do dij(k)d_{ij}^{(k)} ← min(dij(k1)d_{ij}^{(k-1)},dik(k1)d_{ik}^{(k-1)}+dkj(k1)d_{kj}^{(k-1)})
 return D(n)D^{(n)}

运行开销:Θ(n3)Θ(n^3)
算法设计与分析课程复习笔记12——全点对最短路径
参考:任课教师邱德红教授的课件

相关文章:

  • 2021-04-29
  • 2021-08-19
  • 2021-10-20
  • 2022-12-23
  • 2021-09-11
  • 2021-10-06
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-10-11
  • 2021-04-16
  • 2022-01-07
  • 2021-12-12
  • 2021-12-12
  • 2021-07-22
相关资源
相似解决方案