Floyd演算法簡介

2022-08-21 19:45:09 字數 1734 閱讀 8034

參考:

一.floyd演算法的介紹

1.演算法的特點:

弗洛伊德演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理無向圖或有向圖或負權(僅適合權值非負的圖)的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。

2.演算法的思路:

通過floyd計算圖g=(v,e)中各個頂點的最短路徑時,需要引入兩個矩陣,矩陣s中的元素a[i][j]表示頂點i(第i個頂點)到頂點j(第j個頂點)的距離。矩陣p(記錄最短路的路徑需要,若題目不需要求路徑則不需要p陣列)中的元素b[i][j],表示頂點i到頂點j經過了頂點b[i][j]。

假設圖g中頂點個數為n,則需要對矩陣d和矩陣p進行n次更新。初始時,矩陣d中頂點a[i][j]的距離為頂點i到頂點j的權值;如果i和j不相鄰,則a[i][j]=∞,矩陣p的值為頂點b[i][j]的j的值。 接下來開始,對矩陣d進行n次更新。第1次更新時,如果」a[i][j]的距離」 > 「a[i][0]+a[0][j]」(a[i][0]+a[0][j]表示」i與j之間經過第1個頂點的距離」),則更新a[i][j]為」a[i][0]+a[0][j]」,更新b[i][j]=b[i][0]。 同理,第k次更新時,如果」a[i][j]的距離」 > 「a[i][k-1]+a[k-1][j]」,則更新a[i][j]為」a[i][k-1]+a[k-1][j]」,b[i][j]=b[i][k-1]。實質上是揹包dp問題,最外層迴圈是k,表示利用前k個作為中間計算a[i][j]的最小值,本來需要三位陣列a[k][i][j],因為第k次迴圈只會用到a[k-1][i][j],所以利用滾動陣列,使用二維陣列即可。更新n次之後,操作完成!時間複雜度為o(n^3),空間複雜度為o(n^2)。

核心**:

1

for(k=0;k)

2for(i=0;i)

3for(j=0;j4

if(a[i][j]>a[i][k]+a[k][j])

5 a[i][j]=a[i][k]+a[k][j],b[i][j]=b[i][k];

只有5行!現在你會發現這個看起來很高大上的演算法很簡單了,算是最短路的4個演算法裡最暴力的了!

3.例項:

題意:有n種動物,m種直接轉換的咒語,且轉換具有傳遞性,求從哪一種動物到另一種的動物的最長咒語的最小值,若不能轉換到所有動物,則輸出0.

思路:floyd演算法的裸應用,將動物抽象為點,咒語長度抽象為邊的權值,**如下:

#includeusing

namespace

std;

const

int inf=0x3f3f3f3f

;int

n,m,a,b,c;

int mp[105][105

];int

main()

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

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

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

if(mp[i][j]>mp[i][k]+mp[k][j])

mp[i][j]=mp[i][k]+mp[k][j];

int maxi,minv=0,res=inf;

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

if(minv)

printf(

"%d %d\n

",minv,res);

else

printf(

"0\n");

return0;

}

Floyd演算法簡介

演算法定義 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshall演算法的時間複雜度為o n 3 空間複雜度為o n2 演算法...

Floyd演算法思想

本來 量如此小的演算法不用出模板了,但是的確思想還是很好的。1.定義概覽 floyd warshall演算法 floyd warshall algorithm 是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。floyd warshal...

Floyd演算法 模板

floyd演算法又稱為插點法,是一種用於尋找給定的加權圖中多源點之間最短路徑的演算法。該演算法名稱以創始人之一 1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名。注意 其實很多題目不是直接問你 floyd 怎麼求最短路徑,而是要你利用 floyd 的動態規劃思想解決類似 floy...