Dijkstra算法和Floyd算法的正确性证明

Dijkstra算法正确性证明
在这里插入图片描述
命题:当算法进行到第 k 步时,对于
S 中每个结点 i,dist [i] = short [i]
归纳基础
k = 1, S = {s}, dist [s] = short [s] = 0.
归纳步骤
证明:假设命题对 k 为真,则对 k+1命题也为真.
归纳步骤证明:
假设命题对k为真,考虑 k+1步算法 选择顶点v (边<u,v>)。需要证明若存在另一条 s-v 路径 L (绿色),最 后一次出 S 的顶点为 x, 经过 V-S 的 第一个顶点 y,再由 y 经过一段在 V-S 中的路径到达 v .
在 k+1步算法选择顶点 v,而不是 y , dist [v] <=dist [y]
令 y 到 v 的路径长度为 d(y,v),则dist [y]+d(y,v)<=L
于是 dist [v]<=L,即 dist[v]= short [v]

Floyd算法的正确性证明
现在要用数学归纳法证明:
证明的问题是:假设存在一条最短路径为i,d1,d2,d3,…,dk,j (i,j,dt均为点的标号),也就是说从i到j的最短路径就是这一条,并且其中任意两点距离也都是最短的(反证法)。我们现在需要证明,这条路径的权值在外层循环k=max(d1,d2,d3,…,dk),我们记成max(i to j),被填入到矩阵D中。

设P为i与j的最短路径中还需要经过的点的个数
当P=0的时候显然成立,因为i与j的最短路径为直接相连的那条边

当P=1的时候也成立,因为当外层循环k等于那个点的时候,就可以得到D[i][k]+D[k][j]并填入到D中

假设P<=m时成立,即对于任意两点路径,若它们之间经过的点小于等于m,则有k=max(d1,d2,…,dP)时,i,j最短路径权值被填入到矩阵D中。

当P=m+1时,找到这经过的m+1个点中标号最大的点dt,也就是说dt=max(d1,d2,…,dm+1),那么dt与j或i之间最多只有m个点,按照前面的假设,我们知道在k=max(i to dt)和k=max(dt to j)的时候,D[i][dt]和D[dt][j]会获得最短的路径权值,又因为dt > max(i to dt) 且 dt > max(dt to j),所以当k=dt的时候,我们知道D[i][j]=D[i][dt]+D[dt][j]一定是最后的结果了,这时,P=m+1情况成立。

猜你喜欢

转载自blog.csdn.net/weixin_42034217/article/details/84845948