关于Floyd算法三重循环顺序的问题
2017-03-26 21:34
791 查看
Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在)
voidFloyd(MGraph g)
{
int A[MAXV][MAXV];
intpath[MAXV][MAXV];
int i,j,k,n=g.n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
A[i][j]=g.edges[i][j];
path[i][j]=-1;
}
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(A[i][j]>(A[i][k]+A[k][j]))
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
}
那么,可不可以先循环i和j,然后把k放到最内层呢?
答案是不行的,如果打乱了i、j、k的顺序,则程序无法得出正确的结果。
可以把k想象成一个阶段,即k为中转点时,枚举i、j,通过k的变动不停地松弛i、j之间的最短路。因为i、j可以重复遍历,但k不能。如果k在内层循环,程序无法进行多次的松弛操作,也就是程序出错的原因。
shan_mx
voidFloyd(MGraph g)
{
int A[MAXV][MAXV];
intpath[MAXV][MAXV];
int i,j,k,n=g.n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
A[i][j]=g.edges[i][j];
path[i][j]=-1;
}
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(A[i][j]>(A[i][k]+A[k][j]))
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
}
那么,可不可以先循环i和j,然后把k放到最内层呢?
答案是不行的,如果打乱了i、j、k的顺序,则程序无法得出正确的结果。
可以把k想象成一个阶段,即k为中转点时,枚举i、j,通过k的变动不停地松弛i、j之间的最短路。因为i、j可以重复遍历,但k不能。如果k在内层循环,程序无法进行多次的松弛操作,也就是程序出错的原因。
shan_mx
相关文章推荐
- 关于Floyd算法三层循环顺序问题
- 关于for 循环里 线程执行顺序问题
- 关于js中循环遍历中顺序执行多个嵌套ajax的问题
- JavaScript关于自调用循环函数解决代码加载顺序的问题
- 关于Java new对象构造方法执行顺序 解释恶汉单例模式死循环问题
- 关于网络传输字节顺序的问题: hton? or ntoh?
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于初学ASP.NET技术的学习顺序问题
- 关于在Log4j中使用JDBCAppender时出现死循环的问题
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于类成员的初始化顺序问题
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 一个关于顺序显示记录的问题!!!
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于table控件的一个疑难问题(涉及循环)
- 关于ASP.NET技术的学习顺序问题(转)
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于在DELPHI中FOR循环语句的使用问题