/ x: A2 T2 D9 V' I; ?9 Z$ X```python, d; U) y' b/ f- @
def bellman_ford(graph, start):/ w5 {7 p$ {+ s7 L! s1 s( a; c+ b/ |
# 初始化距离 9 t g0 v8 \' R, c/ p$ ~; o distances = {node: float('inf') for node in graph}/ n) N) w7 k3 B5 d+ Y7 s4 f
distances[start] = 0- \9 V/ N$ B/ r2 ^, K7 o$ x
) c6 N& w u8 l1 b. m$ O
# 松弛操作" `5 |, U2 l' M6 t+ S
for _ in range(len(graph) - 1): + y& h6 p: G: Y, H' |0 ^8 M' w+ x for u in graph:3 o& ~3 A7 q% C# E( U
for v, weight in graph[u].items():0 w1 {2 j1 ?9 z5 g. {$ w
if distances[u] + weight < distances[v]:2 P: C6 p4 P& x) b% i7 ^0 q
distances[v] = distances[u] + weight 6 K/ ?- g8 X% \; G* |; P( e! H$ d8 T8 k, i8 z/ C' ]
# 检查负权回路3 q8 X3 d. W0 A: w# t1 c
for u in graph:- p a7 ]" Y1 u, C% n
for v, weight in graph[u].items():, l- }; ?+ {' b1 N/ ?% D7 [: a
if distances[u] + weight < distances[v]: ; F2 D y, H. X4 B raise ValueError("Graph contains a negative weight cycle") 3 S) R. k0 O+ a! b 6 h( c6 Q$ {1 _8 y N8 \8 f return distances! `4 p7 |: e7 K
- }- y; s i5 _7 W& Y6 w# 示例图(带有负权边)0 ?3 D; z' N* t, W" K- x
graph_with_negative_weight = {; y. P1 A4 f1 a3 U& K1 L, R& l0 I1 A
'A': {'B': 1, 'C': 4}, 4 W4 E+ b/ i( Q l6 b9 c6 X, Z 'B': {'C': -3, 'D': 2},2 Y+ g) D( u q; r
'C': {},/ ^* g, t2 h+ j
'D': {'A': -1}. q' [: F# k6 N5 B0 T" {( ~% S
}/ [$ D0 h1 N- i
" m3 W3 u0 n( R. |' p
start_node = 'A' 0 Z8 D) g1 t3 {3 E) o- r0 Rshortest_paths = bellman_ford(graph_with_negative_weight, start_node) * h9 c7 o" s+ U- Q0 {& @print(shortest_paths) # {'A': 0, 'B': 1, 'C': -2, 'D': 3} - u, S& g- n& A& Y& P``` ( I( X2 R/ S" X! U- E* W 8 T( ?( S- u" R, v( T## 3. Floyd-Warshall 算法 ; N5 y9 U2 @! c# U1 b8 @) N9 u' l! G& s8 Z
Floyd-Warshall 算法用于寻找图中所有节点之间的最短路径,适用于边权任意的图,包括有负权边但无负权回路的情况。 / l2 I/ t1 ?/ C' {0 L' C! G / ]7 J# j+ t8 Y### 原理步骤 4 t6 U6 c8 N4 k0 S6 l P " E# A( X2 c6 a' x4 `4 I1. **初始化**: , A3 f; {$ Z; `' Y' M - 创建一个距离矩阵,初始化为无穷大,源节点到自身的距离置为0,直接相连的节点的距离为边权。' F. j5 U. t3 B& M: w6 S
+ h4 p1 n" y. q7 ~8 q2 Z; k2. **更新路径**: e: ?3 f5 B) \7 ?4 X, |. f5 ` - 三重循环遍历所有节点,以每个中间节点尝试更新路径。 2 r# H9 {$ G: b" a6 K: q ' E8 Y; V! S7 X; O7 s3. **输出结果**: ) B- t& s1 ]8 x2 B5 O! \ - 最终得到的矩阵即为每对节点之间的最短路径长度。: M) B8 @ |! g" [
+ N. F5 c4 \# o" A8 ]+ H
### 示例代码 : V6 Y, a& c4 K$ C& D8 B3 E, v G# h: X+ H
```python , b" x. s& }& k6 b' s/ z" Zdef floyd_warshall(graph):% u2 n" W1 t: A
# 初始化距离矩阵. h+ B3 U* H- W/ \2 ~
nodes = list(graph.keys()) 9 C" |; I& K3 ^ distances = {node: {n: float('inf') for n in nodes} for node in nodes}# \3 N0 ?# S5 v o1 X; @
& k$ B* i* j, f for u in nodes: & ~" |9 D7 T% F' ]1 |5 r* _. e- w distances[u][u] = 0 Q' d) Z$ O- A4 y( E5 N for v, weight in graph[u].items():6 u! q2 p5 n: i5 L
distances[u][v] = weight 0 Y( i" j! T, \1 V7 B 4 X9 o7 B# f5 H% e i # 更新路径 + a+ p$ q [5 l5 P' _ for k in nodes: . n4 v6 W! M7 {- n: E for i in nodes:; e/ s, l! p1 }) o
for j in nodes:' C5 q# S r/ Y, a% ^7 n
if distances[i][j] > distances[i][k] + distances[k][j]: ) t4 G( v+ s, \: P1 O$ x distances[i][j] = distances[i][k] + distances[k][j] 8 t- B2 d. U$ L! q, S . j) P; K1 y& N/ ` return distances, [5 ^( ^4 `9 s/ h4 g# `