算法设计与分析课程复习笔记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}wkj
递归解
lij(m)l_{ij}^{(m)}lij(m):从i到j至多含有m条边的最短路径的权
m=0, lij(0)l_{ij}^{(0)}lij(0)=0,if i =j; lij(0)l_{ij}^{(0)}lij(0)=∞\infty∞,if i ≠j。
m≥\geq≥ 0,lij(m)l_{ij}^{(m)}lij(m) = min1≤k≤n{
lik(m−1)+wkj}min_{1≤k≤n}\{l_{ik}^{(m-1)}+w_{kj}\}min1≤k≤n{
lik(m−1)+wkj}
计算最短路径
m=1:lij(1)l_{ij}^{(1)}lij(1)=wijw_{ij}wij,L(1)L^{(1)}L(1)=W
给出W = (wijw_{ij}wij), 计算L(1),L(2),…,L(n−1)L^{(1)}, L^{(2)}, …, L^{(n-1)}L(1),L(