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情况成立。
综上所述,结论得证。
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情况成立。
综上所述,结论得证。
相关文章推荐
- traceroute和tracert的原理
- vs2013 配置是的问题 windows7
- Stack 栈 ----Queue 队列
- 【WEB前端】3.(扩展)内联块
- Javaweb学习总结(二):JSP的指令元素
- 《解释的工具:生活中的经济学原理》读书笔记5
- 马哥linux学习笔记:DNS相关配置
- eclipse创建配置struts项目时遇到的ClassNotFoundException问题解决方案
- [Leetcode]-Majority Element
- UVA - 11021 - Tribles 递推概率
- linux中的sleep与alarm
- Linux下DIR,dirent,stat等结构体详解
- SIGALRM信号会中断sleep
- android studio-创建第一个项目
- C#高级编程笔记(二)
- hdu 2551 竹青遍野
- leetcode笔记:Power of Three
- 蜗牛历险记(一) 平台搭建
- 数据结构之散列表实现
- orm2 中文文档 7. 创建和更新记录