關於對Floyd算法的思索
這個問題困擾我很久了,終於還是上機得到了證實,實踐出真知啊!
將循環的順序改為倒置一樣是正確的【不論是 k,i,j 中的一個或者幾個倒置,都是正確的】,如果倒置了就不能理解為:加入前K個點時的最短路,而是理解為每個點加入都是當前最短路。。。
正序之代碼:
#include <stdio.h> #define MAX 999999 int main() { //無向無環圖的floyd int map[6][6]; int i,j; for(i=0;i<6;i++) for(j=0;j<6;j++) map[i][j]=MAX; //自己到自己的距離是0 for(i=0;i<6;i++) map[i][i]=0; //init map[1][2]=map[2][1]=10; map[1][3]=map[3][1]=4; map[2][3]=map[3][2]=5; map[2][4]=map[4][2]=2; map[4][3]=map[3][4]=1; printf("Floyd中......\n"); //Floyd正式開始,隻有四個點 int k; for(k=1;k<=4;k++) for(i=1;i<=4;i++) for(j=1;j<=4;j++) //display if(map[i][j]>map[i][k]+map[k][j]) { map[i][j]=map[i][k]+map[k][j]; printf("已更新:map[%c][%c] = %d\n",i+'A'-1,j+'A'-1,map[i][j]); } //Floyd結束 printf("最終:\n"); for(i=1;i<=4;i++) for(j=1;j<=4;j++) printf("map[%c][%c] = %d\n",i+'A'-1,j+'A'-1,map[i][j]); return 0; }
上麵代碼描述的圖是:

運行結果是:
一倒序:
for(k=4;k>=1;k--) for(i=1;i<=4;i++) for(j=1;j<=4;j++)
三倒序:
for(k=4;k>=1;k--) for(i=4;i>=1;i--) for(j=4;j>=1;j--)

最後更新:2017-04-03 14:53:53