算法设计与分析课程复习笔记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) +
递归解
:从i到j至多含有m条边的最短路径的权
m=0,
=0,if i =j;
=
,if i ≠j。
m
0,
=
计算最短路径
m=1:
=
,
=W
给出W = (
), 计算
包含最短路径
计算过程:给出
和W,计算
如果没有负权回路, 所有的最短路径至多含有n -1条边, 因此有
δ(i, j) =
and
,
……=
延伸算法
Extend(L,W,n)
create L’, an n*n matrix
for i ← 1 to n
do for j ← 1 to n
do
←
for k ← 1 to n
do
← min(
,
+
)
return L’
运行开销:
成对最短路径算法(慢速)
SLOW-ALL-PAIRS-SHORTEST-PATHS(W,n)
← W
for m ← 2 to n-1
do
← Extend(
,W,n)
return
运行开销:
例如给定W,先计算
=W,则
=
,接着由
和W计算
=
,以此类推,直到计算出
改进运行时间
- 不必计算所有
- 如果没有负回路, 则有: = for all m n-1
- 通过计算以下序列: =W, =W2=W*W, =W4=W2*W2, =W8=W4*W4
=
快速算法FASTER-APSP(W, n)
← W
m ← 1
while m < n-1
do
← Extend(
,
,n)
m ← 2m
return
运行开销:
Floyd-Warshall 算法
给定:G(V,E),可以存在负权边,但不能存在负权回路。
计算:点对之间的最短距离
最短路径结构
对于任何点对i和j, 考虑所有从i到j的路径, 这些路径的中间节点来自集合{1, 2, …, k}
:从i到j的路径的权值, 中间节点来自集合{1, 2, …, k} )
例如:
如果顶点k不是路径p的中间节点,则从i到j的中间节点来自{1, 2, …,k}的最短路径即是从i到j的中间节点来自{1,2, …, k - 1}的最短路径。
如果顶点k是路径p的中间节点,则
是i到k的最短路径,
是k到j的最短路径,k不是
,
的中间节点,
和
是最短路径。
递归解
k=0,
=
k
1,顶点k不是路径p的中间节点,
=
顶点k是路径p的中间节点,
=
+
最终解: =( )
FLOYD-WARSHALL(W)
n ← rows[W]
← W
for k ← 1 to n
do for i ← 1 to n
do for j ← 1 to n
do
← min(
,
+
)
return
运行开销:
参考:任课教师邱德红教授的课件