Floyd最短路径算法是基于这样一个事实:从
v
i
v_i
vi到
v
j
v_j
vj的最短路径总是先从
v
1
v_1
v1沿着一条路到某一点
v
i
v_i
vi,再沿
(
v
i
,
v
j
)
(v_i,\ v_j)
(vi, vj)到
v
j
v_j
vj。而从
v
1
v_1
v1到
v
i
v_i
vi这条路必然是从
v
1
v_1
v1到
v
i
v_i
vi的最短路。
下面我们来进行具体的代码设计,算法设计的基本思想是:首先设置一个长度矩阵,然后
第一次迭代:从一点到另一点只能通过
v
1
v_1
v1,求任意两点间的最短路径,更新长度矩阵。
第二次迭代:从一点到另一点只能通过
v
1
、
v
2
v_1、v_2
v1、v2点,求任意两点间的最短路径,更新长度矩阵。
第三次迭代:从一点到另一点只能通过
v
1
、
v
2
、
v
3
v1、v_2、v_3
v1、v2、v3,求任意两点间的最短路径,更新长度矩阵。
…
经过N(N就是矩阵的长度或者宽度)次迭代,我们便可以得到最终的长度矩阵,这个长度矩阵便可以反映各个点之间的最短距离。
void Floyd(int (*Map)[7], int (*result)[7], int row, int column)
{
//This part is to keep the Map, because i don't want it to be changed, i copy it to the result map.
int k, i, j;
for(i = 0; i < row; i++){
for(j = 0; j < column; j++){
result[i][j] = Map[i][j];
}
}
//This is the hardcore of the Floyd algorithm
for(k = 0;k < row;k++)
for(i = 0;i < row;i++)
for(j = 0;j < column;j++)
if( result[i][j] > result[i][k] + result[k][j] )
result[i][j] = result[i][k] + result[k][j];
}