最短距離之Floyd演算法

2021-10-03 15:26:12 字數 2109 閱讀 7026

floyd演算法求解下圖各個頂點的最短距離。寫出floyd演算法的偽**和給出距離矩陣(頂點之間的最短距離矩陣)。

floyd演算法可以方便的求得任意兩點的最短路徑,這稱為多源最短路,演算法的核心思想是動態規劃

它將多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解。

根據以往的經驗,如果要找到兩個頂點直接的最短路程,一般要引入第三個點(如k),即以k為中轉點,路線為i->k->j,這樣就可以縮短i到j的距離。但是k是1到n的哪乙個呢,甚至可能不止有乙個中轉點,而是經過兩個點或者更多點中轉會更短,即路線為i->k1->k2->j或者i->k1->k2…->ki>j。

各點初始距離圖

假設現在只允許通過1號頂點,即判斷以1號為中轉點,判斷是否產生更短的路徑,即判斷distmap[i][0]+ distmap[0][j]是否比distmap[i][j]要小

**實現為

更新後各點的距離

可以看出,只通過1號頂點的情況下,distmap[3][2]distmap[4][2]和distmap[4][3] 都得到了更新

接下來我們引入2號頂點,求只允許經過1號和2號兩個頂點的情況下的最短路程。

這時候我們在保留只經過1號頂點的最短距離的情況下,再判斷經過2號頂點是否可以產生更短路徑。即判斷distmap[i][1]+ distmap[1][j]是否比distmap[i][j]要小

**實現為:

for

(int i=

0;i)for

(int j=

0;j) distmap[i]

[j]=

min(distmap[i]

[j],distmap[i][0

]+distmap[0]

[j])

;for

(int i=

0;i)for

(int j=

0;j) distmap[i]

[j]=

min(distmap[i]

[j],distmap[i][1

]+distmap[1]

[j])

;

相比於只允許通過1號頂點進行中轉的情況下,這裡允許通過1和2號頂點進行中轉,再次更新了最短距離。同理,以此類推,再允許1,2,3頂點作為中轉可再次更新,但我們知道僅僅幾次是不能確定最短的,所有總共要通過n次即通過1~n頂點作為中轉後,才可以得到最短距離,所以我們可以發現他其實是由前n-1個中轉後的狀態來推出第n個狀態,這也是使得floyd演算法雖然容易理解和編寫,但複雜度較大。

void

floyd()

prim演算法的核心就是三重巢狀for迴圈,所以時間複雜度為o(n³)

Floyd演算法求解最短距離

用floyd演算法求解下圖各個頂點的最短距離。寫出floyd演算法的偽 和給出距離矩陣 頂點之間的最短距離矩陣 floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法,與dijkstra演算法類似。如果要讓任意兩點之間的路程變短,只能引入第三個點 頂點k ...

Floyd求最短距離

用floyd演算法求解下圖各個頂點的最短距離。寫出floyd演算法的偽 和給出距離 頂點之間的 最短距離矩陣 按實驗報告模板編寫演算法。floyd演算法的基本思想如下 從任意節點a到任意節點b的最短路徑不外乎2種可能,1是直接從a到b,2是從a經過若干個節點x到b。所以,我們假設dis ab 為節點...

最短距離及最短路(Floyd 演算法)

include include using namespace std define n 100 define max 1000000 int d n n int path n n void min d int h 該函式找出最短距離,及最短路徑 coutcoutint h,a,b,k cout 輸...