9. v5 60 0 1 2 3 4 5
100
v0 30
v4 D ∞ 10 50
60
∞ 30 100
30 90
60
10 20 0 1 2 3 4 5
10
v1 5 50 v3 final TF F F
T F
T F
T F
T
v2 P
0 1 2 3 4 5 D[i] 表示当前所找到的
0 0 ∞ 10 ∞ 30 100 从始点 v 到每个终点 vi
邻 1 ∞ 0 5 ∞ ∞ ∞ 的最短路径的长度
接 2 ∞ ∞ 0 50 ∞ ∞ Final[v] 为 true 表示 v
进入到 S 集 . 即找到了
矩 3 ∞ ∞ ∞ 0 ∞ 10
v0 到 v 的最短路径 .v0-
阵 4 ∞ ∞ ∞ 20 0 60
v 的距离为 D[v], 路径
5 ∞ ∞ ∞ ∞ ∞ 0 保存在 P[v] 中 .
10. v5 60 0 1 2 3 4 5
100
30 D ∞ 10 50
60
∞ 30 100
30 90
60
v0 v4
10 0 1 2 3 4 5
20
10
final F
T F F
T F
T F
T F
T
v1 5 50 v3
v2
起点 - 距离 路径 Path
终点 D Path v0 v1 v2 v3 v4 v5
v0-v1 ∞ P[v1 v0 T F F F F F
v0-v2 10 ]
P[v2 v0-v2 T F T F F F
v0-v3 50 ]
P[v3 v0-v4-v3 T F F T T F
v0-v4 30 ]
P[v4 v0-v4 T F F F T F
v0-v5 60 ]
P[v5 v0-v4-v3-v5 T F F T T T
]
17. 算法实现
l 定义一个 n 阶方阵序列
D(-1) , D(0) , D (1) , ...,D (k) , ...,D (k-1)
其中 D (-1) [i][j] = G.arcs[i][j]
D (k) [i][j] = Min{ D (k-1) [i][j],
D(k-1)[i][k]+D (k-1) [k][j] } 0≤k ≤n-1
18. 算法实现
l 分析看出 D (1) [i][j] 为从 vi 到 vj 的中间
顶点的序号不大于 1 的最短路径的长
度.
l D (k) [i][j] 为从 vi 到 vj 的中间顶点的序
号不大于 k 的最短路径的长度 .
l D (n-1) [i][j] 就是从 vi 到 vj 的最短路径
的长度 .
19. 6 A B C
0 1
A 4 B A 0 4 11
11 B 6 0 2
3 2
C C 3 ∞ 0
2
D D(-1) D(0) D(1) D(2)
0 1 2 0 1 2 0 1 2 0 1 2
0 0 4 11 0 4 11 0 4 6 0 4 6
1 6 0 2 6 0 2 6 0 2 5 0 2
2 3 ∞ 0 3 7 0 3 7 0 3 7 0
Min(CB,CAB) Min(BAC,BC) Min(AC,ABC)
=Min(∞,7)=7 =Min(17,2)=2 =Min(11,6)=2
20. 6 A B C
0 1
A 4 B A 0 4 11
11 B 6 0 2
3 2
3 ∞ 0
2C
C
D D(-1) D(0) D(1) D(2)
0 1 2 0 1 2 0 1 2 0 1 2
0 0 4 11 0 4 11 0 4 6 0 4 6
1 6 0 2 6 0 2 6 0 2 5 0 2
2 3 ∞ 0 3 7 0 3 7 0 3 7 0
P P(-1) P(0) P(1) P(2)
0 1 2 0 1 2 0 1 2 0 1 2
0 AB AC AB AC AB ABC AB ABC
1 BA BC BA BC BA BC BAC BC
2 CA CA CAB CA CAB CA CAB
22. // 对各对结点之间初始已知路径及距离
For (v=0; v<G.vexnum; ++v)
for(w=0; w<G.vexnum; ++w)
D[v][w] = G.arcs[v][w];
for(u=0; u<G.vexnum;++u)
P[v][w][u] = FALSE;
if (D[v][w]<INFINITY){ // 从 v 到 w 有直接
路径
P[v][w][v] = TRUE; P[v][w][w] = TRUE;
} //end if
} //end for
23. for (u = 0; u<G.vexnum;++u)
for(v=0; v<G.vexnum;++v)
for(w=0; w<G.vexnum;++w)
// 如果从 v 经 u 到 w 的一条路径更短
if (D[v][u]+D[u][w] < D[v][w] ) {
D[v][w] = D[v][u]+D[u][w];
for (i=0; i < G.vexnum; ++i)
P[v][w][i] = P[v][u][i] || P[u][w][i];
} //end if
} //ShortestPath_FLOYD
该算法的时间复杂度为 O ( n 3 ) , 该算法对
负权值也适用 .