題目:計算下面此圖任意兩點之間的最短路徑
此圖帶權重的鄰接矩陣如下:
floyed演算法實現的原理:
假設有乙個最簡單的圖如下所示,圖含有三個頂點a、b、c,求ab、ac、bc之間的最短路徑
在求ac之間的最短路徑時,假如我們無視b這個頂點,則圖其實可以簡單的理解為:
我們將三個點之間的問題變成了兩個點之間的問題,ac之間的最短路徑已經變成了比較實線與虛線之間的長短問題,同理,四個點的最短路徑問題也可以通過類似的方式變成三個點的問題再變成兩個點的問題。
假設所有路徑都有且只經過第乙個點
回到最初的問題中來
在圖的鄰接矩陣中已經定義好了兩點之間的已知最短路徑(此時都是實線的長度),我們假設任意兩個點(假設為x、y)之間都有且只經過第乙個點,這樣子x、y兩點之間的路徑問題變成了我們上述實線與虛線的問題,當得虛線更短的情況下的話我們以虛線的長度替代實現的長度作為兩點之間的長度。
在**中無限大我們以999代替;
int k = 0;
for (int i = 0; i < 9; i++)
}}
得到的臨接矩陣如下所示:
只有②和③之間的長度發生變化了,②和③剛好又是與①直接相連的頂點,我們把k設定為4,虛化直連頂點更多的頂點⑤,預計長度的變化將在②、③、⑦、⑧四個頂點之間產生
的確如此,此時直接與⑤相接的頂點之間的路徑出現的更新,如果⑤不是出發頂點或者目的頂點其他頂點並不與頂點⑤直接相接,而是通過②、③、⑦、⑧間接與⑤相接,對於這部分頂點來說⑤猶如黑盒子的存在,可以存在也可以不存在,對他們之間路徑的計算已經不起作用了;
floyed計算任意兩點之間的最短路徑
將所有的點全部進行一次虛化,則任意兩點之間的中間節點都經過虛化,此時兩點之間的最短路徑就可以順利求出;
在原來的**之上增加一次迴圈,所有的頂點都經過一次虛化:
for(int k=0;k<9;k++)
} }
}
計算後得到的鄰接矩陣如下所示:
這個例子有乙個缺點,所有直連的兩點剛好就是兩點之間最短路徑,我們試著將⑥、⑦之間的路徑長度改為1,明顯②-④-⑦-⑥的長度為5小於②-⑥之間的6,鄰接矩陣如下
經過floyed演算法計算後得到的鄰接矩陣如下:
floyed演算法的優化
floyed演算法的時間複雜度是o(n^3),在大量頂點的場景下面計算最短路徑並不適用,在無向圖裡面鄰接矩陣具有對稱性,可以根據鄰接矩陣的對稱性做相應的優化
最短路徑與Floyed演算法
乙個矩陣cost n n cost i j 表示從i到j的路徑長度,如果不通的話就是 1 現在給你乙個矩陣,希望查詢出從p到q的最短路徑長度,不存在路的話輸出 no 是的,這是乙個最短路徑問題,用單源最短路徑 dijkstra 和多源最短路徑 floyd 演算法都可以實現,時間要取決於n和q,因為單...
Floyed 廉價最短路徑
乙個圖中,在滿足最短路的前提下,求最小代價 圖是由一組頂點和一組邊組成的。一條邊連線兩個頂點。例如,圖1表示了乙個有4個頂點v 5條邊的圖。圖中,每條邊e是有方向的,方向從起點到終點,並且每條邊都有價值。用整數0,1,m 1可以表示乙個有m個頂點的圖。一條路徑連線了乙個點vi和另乙個點vj,其方向與...
資料結構 最短路徑演算法之Floyed演算法
floyed warshall 演算法用來找出每對點之間的最短距離。它需要用鄰接矩陣來儲存邊,這個演算法通過考慮最佳子路徑來得到最佳路徑。注意單獨一條邊的路徑也不一定是最佳路徑。時間複雜度o n 3 只要有存下鄰接矩陣的空間,時間一般沒問題,並且不必擔心負權邊的問題。include include ...