上一文中我们谈到了单源路径算法 迪杰特斯拉算法。
今天我们就来继续讲一下这个算法的正确性。如果有点忘记的同学们可以先点回去复习一下,尤其是注意一下迪杰特斯拉算法的贪婪规则。
我们怎么证明该算法的正确性呢?老规矩,我们使用数学归纳法(一般想不到什么好办法,就用这个办法吧)。
当X为空时,我们会选择与起点s点最近的点加入X,显然s到该点的最近路径选择是正确的。
我们假设已经有一个X了,且所有X中节点对应的最短路径以及长度均正确存储在A[v], B[v]中。
现在我们假设新加入一个点w时, 存在一条额外的路径使得该路径比迪杰特斯拉算法选择的路径还要更短。
如上图所示,我们假设v到w是算法选择的路径。注意此时y点不在X中。大家还记得迪杰特斯拉算法选择新的点加入X中的原则吗?我当时还强调了一下,上文中用红字显示的。即在所有从X出发的边中选择使得 最小的(v, w)。 大家有没有发现我们是选择的一条边啊,表面上看起来是选择点加入X这个集合中。但是从X出发的边是不是有很多条,且起点可以是v 也可以是Z啊,因为v和z都在X中。
那么这里,如果算法选择了v到w,那么也就意味着v到w的距离小于
,显然就更加小于
也就说明v到w 才是到w的最短路径。与我们前面的假设就矛盾了。至此我们证明了该算法的正确性。