Dijkstra正确性定理

概述

Dijkstra正确性定理:Dijkstra 算法在边权非负的加权图中,能正确计算从源点到所有其他顶点的单源最短路径。该定理通过数学归纳法(或等价地,通过循环不变量)严格证明了贪心选择——每次取出距离最小的未处理顶点——的正确性。

定理陈述

形式化陈述

定理:设 是一个边权非负的加权图(对所有 ), 为源点。Dijkstra 算法对每个顶点 计算的距离估计值 满足:当 被从优先队列中取出时(即加入集合 时),,其中 是从 的最短路径长度。

前置条件:所有边权

证明概要

证明思路

使用数学归纳法(等价于循环不变量方法)证明。核心是建立关于集合 (已确定最短距离的顶点集)的归纳不变量。

循环不变量:在每次迭代开始时( 为当前已处理顶点集),以下性质成立:

  • (I1) 对所有 (已处理顶点的距离是正确的)
  • (I2) 对所有 (未处理顶点的距离是从 中顶点到达的最短路径长度)

步骤 1:初始化——验证基础步

初始时 ,其余

  • (I1): 为空,条件平凡成立
  • (I2): 为空,不存在从 到达 的路径, 正确

步骤 2:保持——归纳步

假设不变量在某次迭代开始时成立。设 值最小的顶点,将 加入

证明 (即 (I1) 对 成立)

反证法。假设 ,即存在从 的更短路径。考虑这条最短路径 出发,必定在某个点第一次离开 。设 上第一个不在 中的顶点, 上的前驱()。

(由 (I2))。

又因为 是最短路径,

值最小的顶点,所以 。因此 ,与 矛盾。

证明 (I2) 对更新后的 成立

加入 后,对每个 ,从 到达 的最短路径要么不经过 (长度为 ),要么经过 (长度为 )。松弛操作 正确维护了 (I2)。

步骤 3:终止

时,由 (I1),所有顶点的 值都是正确的最短路径长度。

关键引理:上述证明中,边权非负的条件保证了 (不会因为负权边导致绕行后更短)。若存在负权边,该引理不成立,Dijkstra 算法可能给出错误结果。

学术参考:知识库笔记 10.6 最短路径问题 中包含完整的归纳法证明过程。

关键推论

  • 单源最短路径的正确性:Dijkstra 算法终止后,对所有
  • 负权边的限制:Dijkstra 算法不能处理含负权边的图。对于含负权边(但无负权回路)的图,应使用 Bellman-Ford 算法
  • 优先队列实现:使用二叉堆实现的 Dijkstra 算法时间复杂度为
  • 与 BFS 的关系:当所有边权为 1 时,Dijkstra 算法退化为 BFS

应用场景

  • 算法导论 Ch22:Dijkstra 正确性定理是单源最短路径算法的理论基础
  • 网络路由:OSPF 路由协议使用 Dijkstra 算法计算最短路径
  • 地图导航:Google Maps 等导航系统的核心算法(通常使用 A* 作为 Dijkstra 的启发式改进)
  • 游戏 AI:游戏中的寻路算法(A* 是 Dijkstra 的带启发式版本)
  • 社交网络:计算两个人之间的最短关系链

参见