. m2 K2 _( i8 J' v3 v! q! j### 原理步骤 9 v( i5 ]' @% `4 | , W8 y% y' |7 E1. **初始化**:' [, J4 O/ V$ ^+ Q+ B# R1 X$ |8 d
- 创建一个距离矩阵,初始化为无穷大,源节点到自身的距离置为0,直接相连的节点的距离为边权。 2 D- r1 H2 j! F- w0 r8 J; t! V3 t1 ?5 ^- C' k
2. **更新路径**: 2 g1 }9 T: u& t( P( V9 n - 三重循环遍历所有节点,以每个中间节点尝试更新路径。 ( g5 A7 N+ y' ^0 }% s1 {3 H# J & Q, B- r# a G# k' p' Z7 @: @- B3. **输出结果**: # y+ N' w+ f& |, S) ~ - 最终得到的矩阵即为每对节点之间的最短路径长度。 - E- U3 E, t8 S; N. p2 d( V2 r+ M ; J$ _5 [% w1 l1 f- U- k' e### 示例代码) d) g9 A5 Y3 u/ J9 P: n- R5 c* t
. e- g* H( a6 m" K, M
```python. b" Q- P# Y8 q1 {8 W ]; y
def floyd_warshall(graph): : ]/ L9 W7 _9 T1 T3 B8 N # 初始化距离矩阵 3 h0 H/ O, i$ F& C2 O nodes = list(graph.keys()) ' f3 \8 I3 j0 [: k& G: ^ distances = {node: {n: float('inf') for n in nodes} for node in nodes}% D q1 h) X* R0 L( |* Z* O
( K* \, ]. r1 U" \3 R/ N for u in nodes: " u- n. M! h: ~ i" @- p distances[u][u] = 06 W3 A/ I. D5 ^/ K8 B* D$ X' f
for v, weight in graph[u].items(): . L! s3 T! O6 R* Z distances[u][v] = weight8 W2 A; h3 G( m: @- E0 V) m4 B
$ e! R% N6 }" y- K% I5 C( I& B # 更新路径 % P; Y/ R! u1 n w$ j for k in nodes: b" _5 Y* L; ?* W& q for i in nodes: 8 w: ? M( D' O) Y W for j in nodes: ' C% V7 i' J3 H6 J2 R q' ` if distances[i][j] > distances[i][k] + distances[k][j]:' r) e( g) B* ]3 W4 O! Q8 Q& ~
distances[i][j] = distances[i][k] + distances[k][j] ( O0 _! S0 ?# `6 \+ ?7 U* A3 J& u& z: J$ x( i7 g( a
return distances; f$ I* R r4 P! [. ]+ a+ y9 B% Q
( F+ m* ]; L. I( P# 示例图(可以含负权边) ( [5 ]) Z5 M7 {$ A, E8 ]graph_for_floyd = { 7 g) W5 Z+ N. U2 @2 m 'A': {'B': 3, 'C': 8, 'D': -4},0 A5 L1 M" g- o
'B': {'C': 1, 'D': 7},8 L: y& B* ?. A+ q- ], R
'C': {'B': 4}, . Q9 n. ?% d7 V0 k Y }* ~ 'D': {'A': 2, 'C': -5}$ W0 E: [4 K0 N
}: S" {/ ?. P/ K/ w2 o
9 X8 m/ l! Z5 I; ~, D
shortest_paths_matrix = floyd_warshall(graph_for_floyd) * I( w1 w( k' l1 ~! ~! a0 Sfor row in shortest_paths_matrix.items(): $ X* A# M' ?4 C g; J. p" Y print(row) B" l" q) O+ Q0 P- [```& Y) ~0 _, T" Y/ q
) ^1 K/ k1 y% g3 }4 r% u0 s( ?) @## 总结 ! v# u N! @% p1 @ u 2 s+ p7 V4 X' C) t7 q/ d- **Dijkstra 算法**适合用于无负权边图,时间复杂度为 \(O((V + E) \log V)\),其中 \(V\) 为节点数,\(E\) 为边数。 ( c% D h+ C: e/ w8 c Q4 [( r+ V- **Bellman-Ford 算法**适合处理含负权边的图,时间复杂度为 \(O(VE)\)。1 k! G7 o1 x7 n! `
- **Floyd-Warshall 算法**用于所有节点对最短路径计算,时间复杂度为 \(O(V^3)\)。 . I: n/ n" {& s" [5 f1 S& e' l3 U5 t5 }0 `
不同算法适用于不同的问题场景,选择适合的算法是解决最短路径问题的关键。如果需要更详细的介绍或有特定问题,欢迎进一步询问!' I. }4 s3 R6 l, c& Y" N' W; h