1. 程式人生 > >Floyd-Warshall算法(最短路)

Floyd-Warshall算法(最短路)

最短路徑 錯誤 col clas 動態規劃 直接 是的 最短路 color

Flayd-Warshall算法是求任意兩點之間的最短路徑,也就是多源最短路徑;

思路:任何最短路徑兩點之間的最短路徑有兩種情況,一是兩點之間之間相連最短,二是通過k個中間點間接相連最短;(這其實是種動態規劃的思想)

直接上代碼:

 for(int k=1;k<=n;k++){//每循環一次,就可以通過k這個頂點更新任意兩點之間的最短路徑
        for(int i=1;i<=n;i++){
            for(itn j=1;j<n;j++){
                if(e[i][j]>e[i][k]+e[k][j])
                    e[i][j]
>e[i][k]+e[k][j] } } }

剛開始看Flayd-Warshall算法是總是錯誤認為每次只能通過一個點更新,到最後也只是更新了只經過一個點到達的最短路徑;其實不是的,例如要更新1跟4的最短路徑時,正確的最短路徑是1-2-3-4;當以2為中間點時會更新1-2-4和1-2-3;然後再以3為中間點,因為1到3已經更新為1-2-3,所以這時候以三為中間點的1-3-4其實是1-2-3-4;所有只要每個點作為中間點更新一遍就可以求得任意兩點的最短路徑;

Floyd-Warshall算法(最短路)