多源最短路 Floyd演算法

2022-01-11 14:03:04 字數 1983 閱讀 2541

問題的提出:已知乙個有向網(或者無向網),對每一對定點vi!=vj,要求求出vi與vj之間的最短路徑和最短路徑的長度。

解決該問題有以下兩種方法:

(1)輪流以每乙個定點為源點,重複執行dijkstra演算法或者bellman-ford演算法n次,就可以求出每一對頂點之間的最短路徑和最短路徑的長度,總的時間複雜度為o(n^3)。

(2)採用floyd演算法,時間複雜度也是o(n^3),但是形式更為直接。

1.介紹

floyd演算法只有五行**,**簡單,三個for迴圈就可以解決問題,所以它的時間複雜度為o(n^3),可以求多源最短路問題。

2.思想:

floyd演算法的基本思想如下:從任意節點a到任意節點b的最短路徑不外乎2種可能,1是直接從a到b,2是從a經過若干個節點x到b。所以,我們假設dis(ab)為節點a到節點b的最短路徑的距離,對於每乙個節點x,我們檢查dis(ax) + dis(xb) 

舉個例子:已知下圖,

如現在只允許經過1號頂點,求任意兩點之間的最短路程,只需判斷e[i][1]+e[1][j]是否比e[i][j]要小即可。e[i][j]表示的是從i號頂點到j號頂點之間的路程。e[i][1]+e[1][j]表示的是從i號頂點先到1號頂點,再從1號頂點到j號頂點的路程之和。其中i是1~n迴圈,j也是1~n迴圈,**實現如下。

1

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

28 }

接下來繼續求在只允許經過1和2號兩個頂點的情況下任意兩點之間的最短路程。在只允許經過1號頂點時任意兩點的最短路程的結果下,再判斷如果經過2號頂點是否可以使得i號頂點到j號頂點之間的路程變得更短。即判斷e[i][2]+e[2][j]是否比e[i][j]要小,**實現為如下。

1

//經過1號頂點

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

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

4if (e[i][j] > e[i][1]+e[1

][j])

5 e[i][j]=e[i][1]+e[1

][j];6//

經過2號頂點

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

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

9if (e[i][j] > e[i][2]+e[2

][j])

10 e[i][j]=e[i][2]+e[2][j];

最後允許通過所有頂點作為中轉,**如下:

1

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

floyd-warshall演算法核心語句211

}12}13 }

這段**的基本思想就是:最開始只允許經過1號頂點進行中轉,接下來只允許經過1和2號頂點進行中轉……允許經過1~n號所有頂點進行中轉,求任意兩點之間的最短路程。與上面相同

3.**模板:

1 #include 2

#define inf 0x3f3f3f3f

3int map[1000][1000];4

intmain()517

}18inta,b,c;

19for(i=1; i<=m; i++)///

有向圖20

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

floyd-warshall演算法核心語句

2534}35

}36}37

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

輸出最終的結果,最終二維陣列中存的即使兩點之間的最短距離

3843 printf("\n"

);44}45

return0;

46 }

多源最短路演算法 Floyd演算法

我們知道單源最短路是指從某乙個源點到圖中的其它頂點的最短路。多源最短路就是指每乙個點到圖中其他頂點的最短路。那麼有的人肯定想我知道求單源最短路的演算法了,那麼有多少個點我就求多少次唄,這樣做時間效率不高,空間效率也極其低。那麼有什麼演算法求解多源最短路呢?floyd 鄰接矩陣存圖 int dp n ...

多源最短路(floyd)

floyd 就是很簡單很簡單的一種dp 3個for迴圈就出結果 看 就可以知道,floyd就是通過遍歷可能會出現i j比i k k j大的情況,很簡單。貼乙個水題 floyd考的話也是和其他演算法一起考 一般情況下由於floyd的本質,n方的鄰接鍊錶矩陣反而更有效率。include using na...

Floyd多源最短路

可以對每乙個頂點使用dijkstra演算法求多源最短路。這裡我們來介紹另一種解法 floyd floyd演算法的主要思想是迭代。每次迭代會朝著答案更近一步。首先定義乙個二維陣列dk i j k初始等於0 這個二維陣列代表從i到j的最短距離。floyd更適合解決稠密圖,所以我們使用鄰接矩陣來表示圖。初...