floyd算法:
假设一个点直接到另一个点的距离比一个点经过另一个点到另一个点的距离要长所以短距离就是经过这个点的距离,再假设一个点经过两个点到另一个点的总距离要比经过一个点的总距离要短,比如S(a-b-c-d)<S(a-c-d)因为在第一次更新中已经更新了a-b的短距离,所以只要在检测a-b-c的距离比a-c要短就可了。
现在假设有5个点,标记为a,b,c,d,e。所以检验各个点经过另一个点到另一个点的距离大小,用二维数组表示,比如从b-c检测b-a-c的总距离有没有比b-c的总距离短表示为:
map[b][c]=min {map[b][c],map[b][a]+map[a][c]}
map[b][a]为b-a的距离map[a][c]为a-c的距离通过更新这些值令他们保持最小的值
通过公式我们可以得出首先要便利任意一个点到另外一个点的方法,这个在二维数组中可以用一个嵌套循环来实现:
for i = a to e
for j = a to e
map[i][j]//为访问的数组的所有元素
而要表现那个公式就要一个判断语句:
if map[i][j]>map[i][k]+map[k][j]
map[i][j]=map[i][k]+map[k][j]
注:其中 map[i][k] 和 map[k][j] 可能已经在其他次更新中得到最小值
map[i][k]=map[i][k1]+map[k1][k]
map[i][k]=map[k][j1]+map[j1][j]
map[b][c]=min {map[b][c],map[b][a]+map[a][c]}
已经是在前面的运算中是最小值了
但要测试经过不同各个点的最短距离既可以在嵌套循环外面再套一个循环遍历完所有点,在外面遍历所有点的过程中就保证了一个点到另外一个点的距离总为最短距离,所以不管经过几个点都保证是最短距离:
for k = a to e
for i = a to e
for j = a to e
if map[i][j]>map[i][k]+map[k][j]
map[i][j]=map[i][k]+map[k][j]
注:在这个二维数组中一个点到另一个不可达点距离设为 无穷大 ,而该点到自身的距离设为 0 。
const int size=9;
const int MAX=1000000;
int map[size][size]={
{ 0,4,MAX,MAX,MAX,MAX,MAX,8,MAX },
{ 4,0,8,MAX,MAX,MAX,MAX,11,MAX },
{ MAX,8,0,7,MAX,4,MAX,MAX,2 },
{ MAX,MAX,7,0,9,14,MAX,MAX,MAX },
{ MAX,MAX,MAX,9,0,10,MAX,MAX,MAX },
{ MAX,MAX,4,14,10,0,2,MAX,MAX },
{ MAX,MAX,MAX,MAX,MAX,2,0,1,6 },
{ 8,11,MAX,MAX,MAX,MAX,1,0,7 },
{ MAX,MAX,2,MAX,MAX,MAX,6,7,0 }
};
for(int k=0;k<size;k++){
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
if(map[i][j]>map[i][k]+map[k][j]){
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
floyd核心:更新各个点到各个点(另)的已知最短距离