最短路徑之Floyd Warshall

2021-07-29 01:28:06 字數 1713 閱讀 4645

最短路徑之floyd-warshall
1.演算法思路:若要求兩個點的最短路徑,可以通過引入第三個點來間接到目的地,若距離縮短了,那麼我們可以繼續找第四個點…知道所有的點找完了即是最短距離。假設我們點與點的距離如下圖:

由圖可知,4->3的距離為12,假設我們通過1這個頂點來中轉,這時,4->3的距離就縮短為4->1->3,共11。而如果通過1和2來中轉的話,4->3就縮短為10(a[4][1]+a[1][2]+a[2][3]=5+2+3=10)。通過這個例子,我們發現每個頂點都可能使另外兩個頂點的距離變短。下面,我們將問題一般化:

當任意兩個點之間不允許經過第三個點時,這些城市之間的最短路徑就是初始距離,如下:

假如我們現在只允許經過1號頂點,求任意兩點之間的最短路徑,只需要判斷a[i][1]+a[1][j]是否比a[i][j]要下即可。a[i][j]表示的是從i號頂點到j號頂點之間的路徑。a[i][1]+a[1][j]表示從i號頂點到1號頂點,再從一號頂點到j號頂點的路徑之和。其中i是1~n迴圈,j也是1~n迴圈。**如下:

for(int i=1;i<=n;i++)   

}}

在只允許一號頂點的情況下,任意兩點之間的最短路程更新為:

接下來,我們繼續求只在允許經過1和2號兩個頂點的情況下任意兩點之間的最短路徑。如何求?我們只需要在只允許經過1號頂點時任意兩點的最短路程的結果下,在判斷如何經過2號頂點是否可以使得i號頂點到j號頂點之間的路徑更短。即判斷:a[i][2]+a[2][j]是否比a[i][j]要小,在經過1和2號頂點的情況下,任意兩點的最短路徑更新為:

所以。最後**如下:

#include

int main()else

} //初始化鄰接矩陣,a[1][1],a[2][2],a[3][3],a[4][4]初始化為0,表示自己到自己距離為0。其餘為無窮大

for(i=1;i<=beside;i++)

//演算法開始

for(int k=1;k<=point;k++) //表示經過哪個頂點來鬆弛距離,分別用1,2,3,4四個頂點來鬆弛

for(i=1;i<=point;i++)

for(int j=1;j<=point;j++)

}for(i=1;i<=point;i++)

for(int j=1;j<=point;j++)

return

0;}

測試樣例:

第一行:頂點數 邊數(例如4 8表示有4個頂點,8條邊)

第二行:每條邊的資料(例如:1 2 2表示1號頂點到2號頂點的距離為2)

第三行:輸出每個點到另外的點的最短路徑

圖示:

Codeup最短路徑 最短路徑

n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...

最短路徑之spfa

其實就是用佇列對bellman ford進行優化 include include include include include include using namespace std static const int maxn 1000 點的數目 static const int inf 0x3f...

最短路徑之dijistra

dijistra演算法 跑過一邊之後就把源點到所有點的最短距離都求出來了。演算法思想其實應該屬於dp,因為這個問題有著明顯的最優子結構 d y 是指源點到y的最短距離,那顯而易見 d y min 這個和一般的dp題 有點區別,因為一般的都是根據下標來推下乙個,而這個點之間的連線要靠圖來判斷 最重要的...