显然,Dijkstra算法的正确性取决于命题「每当一个结点 v 加入 S 集合时,此时 dis(v) 对应的路径 r:u→v 的长必为全局最短路径长 D(v)」的真伪.
(反证法)假设存在另一条路径 r′:u→v 为全局最短路径,即
D(v)<dis(v)
有一个非常重要的点:r′ 的结点中除了终点 v∈T,必然存在另一点 t∈T.
证明:(反证法)假设 r′ 是只有终点 v 在 T 内的路径.
根据操作2,此时 dis(v) 已经被 v 的所有在 S 内的前驱结点更新(不单只是 v,T 内所有的结点也被所有相应的前驱结点更新),对应的路径 r 已经是所有只有终点 v 在 T 内的路径 u→v 中最短的一条路径,因此不存在另一条只有终点 v 在 T 内的路径 r′,使得 r′ 的路径长 ∣r′∣ 比 r 的路径长 ∣r∣ 短,与假设矛盾.
故 r′ 的结点中除了终点 v∈T,必然存在另一点 t∈T.
因此不妨设路径r′中第一个在T内的结点为t.
对于从 T 中通过Dijkstra算法选出来的结点 v,有另一个非常重要的点:所有在 T 内的结点中,dis(v) 最小.因此
dis(t)≥dis(v)
在全局最短路径 r′ 中,设局部路径
s1:u→ts2:t→v
根据操作2,此时 dis(t) 已经被 t 的所有在 S 内的前驱结点更新,因此 dis(t) 对应的路径已经是只有终点 t 在 T 内的最短路径.因为 s1⊆r′,所以 s1 必为 u→t 的全局最短路径,又因为 s1 是只有终点 t 在 T 内的路径,故 s1 也为只有终点 t 在 T 内的最短路径,因此有