|
7.5.2 各对顶点间的最短路径问题
如果希望求得图中任意两个顶点之间的最短路径,显然只要依次将每个顶点设为源点,调用迪杰斯特拉算法n次便可求出,其时间复杂度为 O(n3)。弗洛伊德提出了另外一个算法,虽然其时间复杂度也是
O(n3),但算法形式更简单。
弗洛伊德算法的基本思想是求得一个 n 阶方阵的序列
D(-1), D(0), D(1), …,D(k),…,D(n-1)
其中:D(-1)[i][j] 表示从顶点
不经过其它顶点直接到达顶点
的路径长度,即
D(-1)[i][j]=G.arcs[i][j],
D(k)[i][j] 则表示中间只可能经过 ,,
… ,
等顶点,且不可能经过 vk+1,vk+2,
… ,vn-1 等顶点的最短路径长度。
由此,D(n-1)[i][j] 自然是从顶点
到顶点
的最短路径长度。
为了记下路径,和上列路径长度序列相对应有路径的方阵序列
P(-1), P(0), P(1), …,P(k),…,P(n-1)
弗洛伊德算法的基本操作为:
if (D[i][k]+D[k][j] < D[i][j])
{
D[i][j] = D[i][k]+D[k][j];
P[i][j] = P[i][k]+P[k][j]
}
其中 k 表示在路径中新增添考虑的顶点号,i 为路径的起始顶点号,j 为路径的终止顶点号。
对有向网 G7 按弗洛伊德算法求得各对顶点之间的最短路径的过程如动画所示。
|
|
n 为图中顶点个数,假设图中顶点依次为
,,,
… ,
换句话说,假设集合S的初始状态为空集,之后依次加入顶点,,,
… 和,则
D[i][j] 表示在所有从顶点
到顶点"其中只含集合S中顶点"的路径中,路径长度的最小值。
(有向网G7)
|
|