floyd演算法
floyd演算法可以用來解決任意兩個頂點之間的最短路徑問題。
核心公式為:
edge[i][j]=min
。即通過對i,j
兩個頂點之間插入頂點後比較路徑的大小來進行鬆弛。
首先我們來定義乙個二維陣列edge[maxn][maxn]
來儲存圖的資訊。
這個圖的edge
陣列初始化以後為
相當於任意兩點之間不允許經過其他點時的距離情況。
code1:
1這裡表示允許一號頂點作為中間點來鬆弛距離,並儲存鬆弛完的結果。//經過1號頂點
2for(i=1;i<=n;i++)
3for(j=1;j<=n;j++)
4if (e[i][j] > e[i][1]+e[1][j]) e[i][j]=e[i][1]+e[1][j];
code2:
1允許一號頂點和二號頂點作為中間點來鬆弛,並儲存。(不是必定會鬆弛!)//經過2號頂點
2for(i=1;i<=n;i++)
3for(j=1;j<=n;j++)
4if (e[i][j] > e[i][2]+e[2][j]) e[i][j]=e[i][2]+e[2][j];
。。。。。
floyd核心**:
1這段**的基本思想就是:最開始只允許經過1for(k=1;k<=n;k++)
2for(i=1;i<=n;i++)
3for(j=1;j<=n;j++)
4if(e[i][j]>e[i][k]+e[k][j])
5 e[i][j]=e[i][k]+e[k][j];
號頂點進行中轉,接下來只允許經過1和
2號頂點進行中轉
……允許經過
1~n號所有頂點進行中轉,求任意兩點之間的最短路程。用一句話概括就是:從
i號頂點到
j號頂點只經過前
k號點的最短路程。
時間複雜度:o(n^3)
部分文字摘自於啊哈磊的blog。
演算法 最短路徑 Floyd演算法
作用 求任意兩點的最短路徑 適用條件 無負邊 時間複雜度 o n3 原理 從a到b的最短路徑有兩種有兩種情況,一是從a直接到b,二是從a經過若單個節點到達b,所以我們對於每乙個點x檢測,對於任意a 和b,dis ax dis xb dis ab 是否成立,如果成立,則更新dis ab dis ax ...
floyd演算法(最短路徑)
最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...
最短路徑Floyd演算法
前面我們介紹了單源最短路徑問題的dijkstra演算法,dijkstra演算法雖然有比較好看的複雜度,但其對於有負權值的圖來講,就顯得力不從心了,下面我們來介紹另一種更為廣泛的最短路徑問題的解法 floyd演算法 floyd演算法 弗洛伊德演算法 的原理基於動態規劃,比如要找出從a到b的經過這k個點...