即 Destimate[n] 等于所有 A 中邻接到 n 的顶点的最短路径加上相关联的弧的权值中的最小值
如果无法从 A 中的顶点达到 n,那么 Destimate[n] = ∞
设 B 中 Destimate 值最小的顶点是 m,则:
将 m 从 B 中删除
将 m 加入到 A 中
D[m] = Destimate[m]
证明
下面使用循环不变式证明 Dijkstra 算法。
不变式: 对 A 中任意顶点 m,D[m] 是其最短路径
初始: 初始时,A 中只有源点,且源点的最短路径是 0,所以不变式成立
保持: 设 n 是 B 中 Destimate 值最小的顶点。 假设 Destimate[n] 不是 n 的最短路径,D[n] 是 n 的最短路径,则 D[n] < Destimate[n]。 因为 Destimate[n] 是只通过 A 中的顶点的最短路径,并且它不是 n 的最短路径,那么 n 的最短路径一定会经过非 A 中的顶点。假设路径上第一个非 A 中的顶点是 j,则 n 的最短路径是 s -> ... -> j -> ... -> n,所以 Destimate[j] <= D[n] < Destimate[n]。这与 n 是 B 中 Destimate 值最小的顶点相矛盾,所以 Destimate[n] 是 n 的最短路径