今天破防了,在学习Floyd算法的过程中本来对Floyd算法步骤感觉挺简单的,但是直到遇上了下面的核心代码,一直下想不明白为什么这几行代码能实现Floyd算法?
//Floyd算法核心部分(后继版)
for(k=0;k<G->vexNum;k++){//考虑k作为途径中转点
for(i=0;i<G->vexNum;i++){//遍历图G
for(j=0;j<G->vexNum;j++)
{
//防止溢出
weightType temp=(dist[i][k]==MAXINT||dist[k][j]==MAXINT)?MAXINT:(dist[i][k]+dist[k][j]);
if(dist[i][j]>temp)
{
dist[i][j]=temp;
path[i][j]=path[i][k];//存入i的后继途径点【i->j途径i->k】
}
}
}
- 首先要知道一点,最短路径上任意两点均为最短路径。例如假设i~j的最短路径为:i->j->k->l。那么i->j、j->k、k->l、i->j->k、j->k->l等均为各自最短。否则i~j的最短路径一定不为:i->j->k->l。
- 那么我们现在假设,i~j的最短路径为i->j->k->l。那么可以知道初始化时i->j、j->k、k->l已经为最短路径了。
- 我们假设先用j作为中转点试探,此时必然可以找到i~k的最短路径i->j->k。此后当我们再以k为中转点试探就可以找到i~j的最短路径为:i->j->k->l。
- 我们假设也可以先用k作为中转点试探,此时必然可以找到j~l的最短路径j->k->l。此后当我们再以j为中转点试探就可以找到i~j的最短路径为:i->j->k->l。
- 参考2过程可知其实上述核心代码的思路就是:
- 不加中转点时(初始化),可以找出所有无中转点的最小路径。
- 加V1为中转点,可以找出所有以V1为中转点的最短路径。
- 再加V2为中转点,可以找出所有以V2或V2->V1或者V1->V2为中转的最小路径。
- ……