最短路徑演算法之一 Floyd演算法

2022-06-02 17:09:13 字數 1279 閱讀 7181

floyd演算法

floyd演算法可以用來解決任意兩個頂點之間的最短路徑問題。

核心公式為:

edge[i][j]=min

。即通過對i,j

兩個頂點之間插入頂點後比較路徑的大小來進行鬆弛。

首先我們來定義乙個二維陣列edge[maxn][maxn]

來儲存圖的資訊。

這個圖的edge

陣列初始化以後為

相當於任意兩點之間不允許經過其他點時的距離情況。

code1:

1

//經過1號頂點

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

3for(j=1;j<=n;j++)

4if (e[i][j] > e[i][1]+e[1][j]) e[i][j]=e[i][1]+e[1][j];

這裡表示允許一號頂點作為中間點來鬆弛距離,並儲存鬆弛完的結果。

code2:

1

//經過2號頂點

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

3for(j=1;j<=n;j++)

4if (e[i][j] > e[i][2]+e[2][j]) e[i][j]=e[i][2]+e[2][j];

允許一號頂點和二號頂點作為中間點來鬆弛,並儲存。(不是必定會鬆弛!)

。。。。。

floyd核心**:

1

for(k=1;k<=n;k++)

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

3for(j=1;j<=n;j++)

4if(e[i][j]>e[i][k]+e[k][j])

5 e[i][j]=e[i][k]+e[k][j];

這段**的基本思想就是:最開始只允許經過1

號頂點進行中轉,接下來只允許經過1和

2號頂點進行中轉

……允許經過

1~n號所有頂點進行中轉,求任意兩點之間的最短路程。用一句話概括就是:從

i號頂點到

j號頂點只經過前

k號點的最短路程。

時間複雜度:o(n^3)

部分文字摘自於啊哈磊的blog。

演算法 最短路徑 Floyd演算法

作用 求任意兩點的最短路徑 適用條件 無負邊 時間複雜度 o n3 原理 從a到b的最短路徑有兩種有兩種情況,一是從a直接到b,二是從a經過若單個節點到達b,所以我們對於每乙個點x檢測,對於任意a 和b,dis ax dis xb dis ab 是否成立,如果成立,則更新dis ab dis ax ...

floyd演算法(最短路徑)

最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...

最短路徑Floyd演算法

前面我們介紹了單源最短路徑問題的dijkstra演算法,dijkstra演算法雖然有比較好看的複雜度,但其對於有負權值的圖來講,就顯得力不從心了,下面我們來介紹另一種更為廣泛的最短路徑問題的解法 floyd演算法 floyd演算法 弗洛伊德演算法 的原理基於動態規劃,比如要找出從a到b的經過這k個點...