最短路問題(floyd演算法)(優化待續)

2022-10-11 11:57:10 字數 3226 閱讀 9594

問題描述:

最短路問題(short-path problem):若網路中的每條邊都有乙個數值(長度、成本、時間等),則找出兩節點(通常是源節點和阱節點)之間總權和最小的路徑就是最短路問題。最短路問題是網路理論解決的典型問題之一,可用來解決管路鋪設、線路安裝、廠區布局和裝置更新等實際問題。

1.floyd演算法

演算法描述:

floyd演算法又稱為插點法,是一種用於尋找給定的加權圖中多源點之間最短路徑的演算法。該演算法名稱以創始人之一、2023年圖靈獎獲得者、史丹福大學電腦科學系教授羅伯特·弗洛伊德命名。

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

下面就講下我對這個演算法的理解:

首先這個演算法能做的事,就是尋找給定的加權圖中多源點之間最短路徑

也就是這張圖:

這裡有n個點,互相之間的路徑長度不一,怎麼求其中任意兩點的最短路徑。

floyd演算法的思路就是從比較入手,比較兩點直接連通和隔乙個點連通的長度。

從v0開始,遍歷任意兩個點,尋找有沒有兩個點通過v0的最短路徑比這兩點直接連通的要短。

比如v0和v2,要比較這兩個點直接連通和隔乙個點連通的長度。從圖上可知,v0-v2的最短路徑是經過v1,走0-1-2,而不是直接0-2。所以結果是經過v1比直接連通要短。

再比如v0和v4,要比較這兩個點直接連通和隔乙個點連通的長度,但v0和v4沒有直接連通怎麼辦,就設v0-v4直接連通的長度是無窮大,這樣不管是經過v1還是經過v2,都比直接連通的長度要短。

找到後怎麼辦,就把最短的長度和路徑結果儲存起來,以此再遍歷下乙個點v1,繼續比較。

全部遍歷一遍後,就可以得到任意兩點之間的最短路徑了。

具體實現如下:

1 #include 2

using

namespace

std;34

#define maxvex 20

5#define maxedge 20

6#define infinity 6553578

910 typedef struct

11mgraph;

1617 typedef int

patharc[maxvex][maxvex];

18 typedef int

shortpathtable[maxvex][maxvex];

1920

void creategraph(mgraph*g)

2140}41

42 g->arc[0][1]=1

;43 g->arc[0][2]=5

;44 g->arc[1][2]=3

;45 g->arc[1][3]=7

;46 g->arc[1][4]=5;47

48 g->arc[2][4]=1

;49 g->arc[2][5]=7

;50 g->arc[3][4]=2

;51 g->arc[3][6]=3

;52 g->arc[4][5]=3;53

54 g->arc[4][6]=6

;55 g->arc[4][7]=9

;56 g->arc[5][7]=5

;57 g->arc[6][7]=2

;58 g->arc[6][8]=7;59

60 g->arc[7][8]=4;61

62for(i = 0;inumvertexes;i++)

6368}69

}7071/*

floyd演算法,求網圖g中各頂點v到其餘頂點w的最短路徑p[v][w]及帶權長度d[v][w]。

*/72

void shortestpath_floyd(mgraph g, patharc *p, shortpathtable *d)

738485}

86for(k = 0;k)

879798}

99100

}101

}102

103}

104105

106int

main()

107132 cout<

->

""<

133}

134 cout<

135136

}137

138 cout<

最短路徑d\n";

139140

for(v=0; vv)

141146 cout<

147}

148149 cout<

最短路徑p\n";

150151

for(v=0; vv)

152157 cout<

158}

159160

return0;

161162

163 }

演算法優化:

floyd(權值非負)適用於有向圖和無向圖

1 floyd 的思想就是通過列舉n個點利用dp的思想來更新最短距離的,假設當前列舉到第k個點,那麼就有任意的兩個點i , j ,如果i k 相連 j k 相連 那麼就可以知道這個時候dis[i][j] = min(dis[i][j] , dis[i][k] + dis[k][j]);,那麼只要列舉完n個點,那麼就說明已經完全更新完所有兩點直間的最短路。

2 floyd演算法是最簡單的最短路徑的演算法,可以計算圖中任意兩點間的最短路徑。floyd演算法的時間複雜度為o(n^3),如果是乙個沒有邊權的圖,把相連的兩點間的距離設為dis[i][j]=1.不相連的兩點設為無窮大,用floyd演算法可以判斷i j兩點是否相連。

3 floyd 演算法不允許所有的權值為負的迴路。可以求出任意兩點之間的最短距離。處理的是無向圖

4 缺點是時間複雜度比較高,不適合計算大量資料

5 如果dis[i][i] != 0,說明此時存在環。 

6 如果利用floyd求最小值的時候,初始化dis為inf , 如果是求最大值的話初始化為-1.

最短路徑問題 Floyd演算法

概念 最短路徑也是圖的乙個應用,即尋找圖中某兩個頂點的最短路徑長度。實際應用 例如確定某兩個城市間的坐火車最短行車路線長度等。floyd algorithm 中文名就是弗洛伊德演算法。演算法思路 用鄰接矩陣來儲存圖的結構,edge i j 表示從結點i到結點j的最短路徑長度,那麼該如何計算edge ...

floyd 最短路演算法

floyd最短路徑演算法 在圖論中經常會遇到這樣的問題,在乙個有向圖裡,求出任意兩個節點之間的最短距離。我們在離散數學 資料結構課上都遇到過這個問題,在計算機網路裡介紹網路層的時候好像也遇到過這個問題,記不請了.但是書本上一律採取的是dijkstra演算法,通過dijkstra演算法可以求出單源最短...

最短路 Floyd演算法

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