問題描述:
最短路問題(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.演...