您的位置:首页 > 其它

Floyd算法正确性

2016-01-10 17:21 141 查看
  Floyd算法是图论中求最短路径的一个算法,三层循环,就能获得任意起始点与终止点的最短路径,很简洁也很神奇,但是一直它的正确性,它为什么能通过这些简洁的循环就达到最优解,算法课里老师也没太讲过,我想就正确性给出一个简单的证明。

  Floyd算法代码如下:

for(int k=0;i<n;k++)  

{  

 

for(int i=0;i<n;i++)  

  {  

    for(int j=0;j<n;j++)  

     {  

       if(D[i][k]+D[k][j]<D[i][j])  

       {  

          D[i][j]=D[i][k]+D[k][j];  

       }  

    }  

  }

}  

 现在要用数学归纳法证明:

 证明的问题是:假设存在一条最短路径为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情况成立。
  综上所述,结论得证。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: