) I- s o5 \7 T3 j+ I2. **更新路径**:" o5 u+ E4 z1 j6 f
- 三重循环遍历所有节点,以每个中间节点尝试更新路径。5 q; h( F) x0 Q
; m5 { T$ i C! Z: T3. **输出结果**: " a) u7 w: _* n$ a1 x - 最终得到的矩阵即为每对节点之间的最短路径长度。/ T6 \* `( m5 h$ A6 ~ d
7 c) f: z& `4 D8 l: G1 E% U. d
### 示例代码 6 L1 I5 J' g) s; p ' D) ?: {- N, T7 T9 k```python 9 r# E, P" |' e3 t. Rdef floyd_warshall(graph):/ k4 }1 n: L9 X1 }1 u' f3 c' A
# 初始化距离矩阵 , r! o, C* U# P8 S# r7 l- s nodes = list(graph.keys())& _; T" \0 f) k. B- |, o
distances = {node: {n: float('inf') for n in nodes} for node in nodes}3 I2 u! y' b) g$ @ w
) X' P) l. l& U" O4 B
for u in nodes: / q. b, X8 F% C' S; i# W6 H) g distances[u][u] = 0 3 f2 `+ G+ R! W. g- v, ~ for v, weight in graph[u].items(): / v" A: F# f, Y. F& I% V: s distances[u][v] = weight ' \; u p. ~& v* b+ v! Z: u! ]6 C1 w/ e0 R6 V
# 更新路径9 {, [& \ b' O* @- O( \( k0 N% i# m/ B
for k in nodes: 5 G# i- w O2 e! D4 X' Q for i in nodes: 8 R) w: K6 f1 o& Y% |/ _( i7 i for j in nodes:+ c# B6 R/ D5 w5 O9 B6 W: W
if distances[i][j] > distances[i][k] + distances[k][j]: $ v {2 |9 |- j2 K u/ k distances[i][j] = distances[i][k] + distances[k][j] * E0 s2 {# l% u% l3 w+ G, m5 j" c. V5 G8 C) D
return distances& @* {( N4 `0 e1 E8 P' ^
2 Y. t* L6 W- q% |4 D# E4 ~# 示例图(可以含负权边)1 `: ?" H# N. \ `- ^2 c" ]6 D5 d
graph_for_floyd = { 5 U" E6 U0 v' D; } 'A': {'B': 3, 'C': 8, 'D': -4}, : q# n3 Z% Q+ e V2 R 'B': {'C': 1, 'D': 7}, 8 m, F+ _* Q: e% n$ @- W 'C': {'B': 4}, " p% y: N+ c6 O, e& b' r5 y 'D': {'A': 2, 'C': -5}- T& W6 p- [) y5 H w: p9 [
} * a' c9 x. a" n- d8 M! e 1 r' _) `- w0 j- m* Y5 Cshortest_paths_matrix = floyd_warshall(graph_for_floyd) 6 Y- j+ j- d. ]+ Lfor row in shortest_paths_matrix.items(): ' n* D7 C' E) D! C5 ~# r, k7 _ print(row) 1 }% o6 n7 n$ H; o. V``` , ~; ]! U! K/ k( D+ L5 _/ u' u3 t/ S1 M2 Q5 l( \0 R
## 总结 " i9 i. p% u' r# h# q- ~ - q& n2 Y* p; l: b, ]* S* ^- **Dijkstra 算法**适合用于无负权边图,时间复杂度为 \(O((V + E) \log V)\),其中 \(V\) 为节点数,\(E\) 为边数。# {8 l% c7 i) o, P' B) J, T
- **Bellman-Ford 算法**适合处理含负权边的图,时间复杂度为 \(O(VE)\)。 & w4 b' E4 R e- **Floyd-Warshall 算法**用于所有节点对最短路径计算,时间复杂度为 \(O(V^3)\)。$ _- g! c3 h% [0 w7 x