/ x4 s8 M) c V; W: m3 y% mstart_node = 'A'( P5 k; ]" o1 h) c: _
shortest_paths = dijkstra(graph, start_node) 4 R& A0 X/ W3 N3 }# O8 w# Bprint(shortest_paths) # {'A': 0, 'B': 1, 'C': 3, 'D': 4}' U0 V0 J7 O- M. I9 E- q
``` 7 ?% O B8 Q4 ]/ y r4 L" i3 a$ m2 A, K## 2. Bellman-Ford 算法/ j: `0 g9 {/ Y& F. G
7 B7 g [8 U; T0 lBellman-Ford 算法能够处理带有负权边的图,但不能处理负权回路。它通过放松操作逐步更新从源节点到所有其他节点的最短路径。 0 H- P$ Q7 M, m# N - J, F% ~0 ]7 @ F5 ?0 E### 原理步骤 0 B" G8 z3 w7 `) T8 P # B0 _! N+ I7 k. P7 A. p1. **初始化**: % ] \* j7 i& n# e - 设置源节点到自己的距离为0,其他节点为无穷大。 ; Q8 ^7 E) ?! y& T' x4 V1 n: m( d. Q* B
2. **松弛操作**: 7 E9 X$ u" u- u) z, U - 对所有边进行松弛操作,循环(V-1)次(V为节点数),尝试更新每个边的距离。7 x. @$ C/ U6 l; c# G8 e; u
+ G) A, c8 }" ] u3 m0 c& @
3. **检查负权回路**:! w: z( ~# s" p5 Y; }" A
- 再次对所有边进行一次松弛检查,如果有边的距离仍能被更新,则说明图中存在负权回路。 8 e0 j3 M' P( x% K6 V) z# @3 _7 ^- r5 d; U9 f4 T( l" }# ?6 A
### 示例代码 . Y5 b o, J- r2 p) B4 s7 w' u& `* \. s+ ^; A; x3 b7 @
```python2 A# _3 j8 N$ p9 P9 N
def bellman_ford(graph, start):9 X' n& d+ {8 u+ T g
# 初始化距离 3 W0 K# s' w J# N ], y6 v distances = {node: float('inf') for node in graph}6 T# D+ N4 d9 H" l5 E
distances[start] = 0 ) K8 A2 Y+ Z# S3 J9 Y; N& W/ q ! [3 k8 y) y% P+ E2 x9 y4 T9 I+ k6 ` # 松弛操作 " i. f& Y; `$ v& P2 }3 u+ e for _ in range(len(graph) - 1):# M+ Q& L4 I6 V! `5 Q+ Y0 p
for u in graph:: v$ _/ f/ k ^7 b( b9 D) `
for v, weight in graph[u].items(): + b* w- @; c6 R; k) M _, Z if distances[u] + weight < distances[v]:! [4 N9 h* T7 K) Y! G( O
distances[v] = distances[u] + weight- {) F# F6 G9 S. w6 J7 h4 m8 u, c
6 a: Z% N. A3 j1 {3 ~7 R7 r5 x2 I # 检查负权回路2 \1 M( D* a1 m ~% _8 p/ }# V
for u in graph: + {5 d. r0 `9 s' V1 y for v, weight in graph[u].items(): 9 T+ p6 S' f4 j4 T" e5 f' Z& E! n$ h if distances[u] + weight < distances[v]:* M& a4 J0 C; s3 i \( p$ O1 n
raise ValueError("Graph contains a negative weight cycle") Y# I# o( n- M' g+ V) n x- R0 a
7 l. C7 r" V7 e* U return distances & O7 H: ^4 Y! ?0 b * y& S8 i- ?, _; A9 C# 示例图(带有负权边) $ T5 ?4 s N2 e7 `+ A5 v% ~& e0 ~graph_with_negative_weight = { $ R# E1 M5 c5 ]% u" |8 c! x) ^1 V6 L$ s 'A': {'B': 1, 'C': 4}, 7 z0 ^- `* e3 g0 ^* |+ v& i; J 'B': {'C': -3, 'D': 2},( \/ h, P% \! |" j# f
'C': {}, 6 ?& G' h* B. ~7 X: D& ?7 H/ V+ u 'D': {'A': -1}7 S' w) u9 Q4 c# ~' v
}- c' l9 n: ~ w* F G% a