为什么Dijkstra算法中真正最短路必须经过最短路集合

为什么Dijkstra算法中真正最短路必须经过最短路集合

  • Dijkstra算法集合
  • 疑惑
  • 证明

Dijkstra算法集合

在Dijkstra算法中,有这样两个集合:

集合 内容
集合S 源点**s(小写)**和已经确定了最短距离的顶点vi
数组dist[] dist[v]为s到v的最短路径长度,但其中路径仅经过集合S中的顶点

疑惑

从Dijkstra算法中我们不难看出,若路径是按照非递减的顺序生成的,Dijistra算法认为真正的最短路径一定只经过S中的顶点。

为什么经过S中的顶点才是最短路径,就不能经过S以外的顶点是最短路径吗?

证明

我们采用反证法1证明这个问题:

如果源点为A,我们即将确定最短路径的点为V
假设Dijkstra的想法是错误的,那么在集合S以外就会存在一个点W,最短路径是

A
W
V

Dijkstra算法不会先经过一个距离更远的点再到V,即A到W的距离肯定小于A到V 的距离

此时我们可以发现:

  1. V是马上要确定最短路径的点
  2. 路径是按照非递减的顺序生成的
  3. A到W的距离小于A到V的距离
  4. 集合S储存的是已经确定了最短距离的顶点vi

也就是说,既然A到W距离比A到V小,而且我们已经到将要确定V的最短距离这一步了,那么W一定已经被确定好最短距离了,即W一定已经被收进集合S中,这与我们的假设矛盾。


  1. 参考 浙江大学 陈越 《数据结构》 ↩︎

你可能感兴趣的:(为什么Dijkstra算法中真正最短路必须经过最短路集合)