floyd演算法的應用1

2022-05-29 01:24:15 字數 2388 閱讀 4006

暑假,小哼準備去一些城市旅遊。有些城市之間有公路,有些城市之間則沒有,如下圖。為了節省經費以及方便計畫旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。

上圖中有4個城市8條公路,公路上的數字表示這條公路的長短。請注意這些公路是單向的。我們現在需要求任意兩個城市之間的最短路程,也就是求任意兩個點之間的最短路徑。這個問題這也被稱為「多源最短路徑」問題。

現在需要乙個資料結構來儲存圖的資訊,我們仍然可以用乙個4*4的矩陣(二維陣列e)來儲存。比如1號城市到2號城市的路程為2,則設e[1][2]的值為2。2號城市無法到達4號城市,則設定e[2][4]的值為∞。另外此處約定乙個城市自己是到自己的也是0,例如e[1][1]為0,具體如下:

**:#include

intmain()

//floyd-warshall演算法核心語句

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

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

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

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

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

//輸出最終的結果

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

printf("\n");

}

return0;

}

有一點需要注意的是:如何表示正無窮。我們通常將正無窮定義為99999999,

因為這樣即使兩個正無窮相加,其和仍然不超過int型別的範圍(c語言int型別可以儲存的最大正整數是2147483647)。

在實際應用中最好估計一下最短路徑的上限,只需要設定比它大一點既可以。例如有100條邊,每條邊不超過100的話,

只需將正無窮設定為10001即可。如果你認為正無窮和其它值相加得到乙個大於正無窮的數是不被允許的話,

我們只需在比較的時候加兩個判斷條件就可以了,請注意下面**中帶有下劃線的語句。12

3456

//floyd-warshall演算法核心語句

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

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

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

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

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

上面**的輸入資料樣式為:12

3456

7894

81

2 21

3 61

4 42

3 33

1 73

4 14

1 54

3 12

結果:

封印之門 Floyd演算法應用

來自藍橋杯 計蒜客傳送門 沒什麼難度。剛剛才知道字母一共有26個,不是24個,wa了好久。include include include define inf 0x3f3f3f3f using namespace std intmain void 下面是floyd核心 for int q 1 q 2...

Floyd演算法的應用 POJ 2240

該題大意是套匯問題,貨幣根據匯率轉換來套取多餘的錢數,由於是各個貨幣兩兩轉換,即由floyd判環應用變形則可解決問題。floyd演算法用於解決任意兩個節點之間的最短距離,判斷是否成環等,其實質為動態規劃。1 floyd演算法的應用 2 include 3 include 4 include 5usi...

floyd演算法的理解

floyd演算法適用於apsp all pairs shortestpaths,多源最短路徑 是一種動態規劃方法 對於稠密圖 點的密集度高 執行效率要高於dijkstra和spfa演算法,這種方法是用二維數 組來儲存點與點之間的距離,所以不適合有大量的點,就像點i到點j之間的距離就儲存 在map i...