Bellman-Ford算法

通过对图中所有边进行|V|-1轮松弛操作来逐步逼近最短路径,能处理负权边并检测负权环

定义

形式化定义

输入: 带权有向图 ,权函数 ,源点 输出:

  • 若图中不存在从 可达的负权环:返回 TRUE,且对所有
  • 若存在从 可达的负权环:返回 FALSE

算法步骤:

  1. 初始化: ,其余
  2. 松弛循环: 对所有边进行 轮松弛
  3. 负权环检测: 再检查所有边,若仍可松弛则存在负权环

核心性质

性质描述
时间复杂度
空间复杂度 数组和 数组)
负权边可以正确处理
负权环检测 轮仍可松弛则存在从 可达的负权环
松弛轮数 轮后找到所有最多 条边的最短路径
提前终止若某轮无更新可提前终止(习题22.1-3)

关系网络

graph LR
    A["Bellman-Ford算法"] --> B["松弛操作"]
    A --> C["负权环"]
    A --> D["最短路径树"]
    A --> E["单源最短路径"]
    A --> F["Johnson算法"]
    A --> G["Dijkstra算法"]
    G -.->|"不能处理负权边"| A

章节扩展

第22章:单源最短路径

Bellman-Ford算法是CLRS第22.1节介绍的通用单源最短路径算法,能处理Dijkstra无法应对的负权边场景。

算法伪代码:

BELLMAN-FORD(G, w, s)
1  INITIALIZE-SINGLE-SOURCE(G, s)
2  for i = 1 to |G.V| - 1
3      for each edge (u, v) ∈ G.E
4          RELAX(u, v, w)
5  for each edge (u, v) ∈ G.E
6      if d[v] > d[u] + w(u, v)
7          return FALSE
8  return TRUE

正确性(定理22.3):

  • 循环不变式:第 轮后,(最多 条边的最短路径权重)
  • 初始化:,其余
  • 维护:路径 (最多 条边),由归纳 ,松弛后
  • 终止: 条边覆盖所有简单路径,

负权环检测(引理22.2):

  • 返回TRUE 不存在负权环(否则 ,但 有限)
  • 存在负权环 返回FALSE( 轮不足以覆盖绕行路径)

补充

补充说明

  • Bellman-Ford算法由Richard Bellman(1958)、Edward F. Moore(1956)和Lester R. Ford Jr.(1956)独立发现
  • RIP路由协议的核心机制基于分布式Bellman-Ford(距离向量路由)
  • SPFA(Shortest Path Faster Algorithm)是Bellman-Ford的队列加速版本,平均接近 ,但最坏仍为
  • 金融套利检测:将货币视为顶点,汇率取负对数作为边权,负权环对应套利机会

参见