最短路演算法小結

2021-07-16 08:23:25 字數 1334 閱讀 1445

dijkstra演算法:

適用於 無負權邊,無環(視所求得「最短」定義而論)的圖的單源最短路問題(也就是考慮乙個點)。

常用 dist[i] 陣列儲存源點 到 i 點的距離,應用貪心的思想,每次 從 未選 點集中 選出距離已選點集最近(最優)的乙個點,然後將此點加入已選點集,嘗試通過此點 更新 源點 到未選點集 的距離(dist[i]陣列),

即dist[i] = min( dist[i],dist[t] + w(t,i) ),其中點 t 是此時新加入已選點集的點,w(t,i) 為 點 t 到 i 的權值。

注意到程式在選擇最優的點很耗時,可以借助優先佇列(常用stl)進行優化,每次取隊頭元素操作即可,非常實用!

bellman-ford 演算法:

適用於 帶負權邊 的 有向圖 的單源最短路問題,但圖中不能包含權值總和為 負 的迴路(此時無最優解),負權無向邊不能處理也是這個道理。

可作為 負權 迴路 是否存在的判斷演算法。

演算法處理方法一般是邊,對於乙個具有 n 個頂點的圖,從源點到任意頂點最多經過 不構成 負權值迴路 的 n - 1條邊,

那麼更新對dist[i]陣列

的更新最多也就是n - 1次(稱作 鬆弛),如果還能進行第n 次鬆弛,是否還會影響dist的值,那

麼就可以判斷是否存在圖中存在 

環,有環的情況可能在n -1 次鬆弛就已經發生了(影響dist的值),但並不影響結論(環可以無限更新dist),所以一般處理n-1次。

當然,如果在某次鬆弛n條邊後,所有dist都沒變,那麼就可以提前結束!

思想和dijkstra很類似,但dijkstra演算法中,某點v一旦確定了,dist[v]就不會變了,然而bellman-ford中不一定。

spfa演算法:

bellman-ford演算法的改進版(更快)。

與dijkstra演算法優先佇列實現相似,但可以通過增加updatetimes[i]陣列 或者 inqe[i] 陣列,來判斷 頂點i 更新的次數(更新次數達到n 時存在環) 

或者 是否在佇列 中,來進一步優化。

建議邊做題邊思考

poj 3159,2387   dijkstra演算法優先佇列實現

poj3259,2240,1860  bellman-ford,spfa演算法模板題

floyd演算法:

嘗試將 i -> j 道路 更新成 i -> k -> j ,即在 點 i 到 j 的 邊,插入中間點k ,來更新 i -> j 路的長度。

思路清晰,方法簡單,但要注意 列舉插入的點 k 要放在 最外層 迴圈!!!

最短路徑演算法小結

不同性質的圖中,所採取的策略有所不同,自然存在各樣的求最短路徑的演算法。對於無向無權圖 也可以假設權值為1 就可以使用最基本的廣度優先搜尋演算法,從源點開始對整個圖進行搜尋,訪問到所有的點。因為廣度優先搜尋最先訪問到的是相鄰的點,所以距離最近的點最先訪問到,記錄的距離也就最小。演算法偽 時間複雜度為...

最短路小結

通過對最短路的學習,我已經部分掌握了3大演算法及其變形,會用一些知識去解決問題,但學無止境,仍有許多知識我知之甚少,我希望通過我的努力會變得越來越強。floyd經典演算法適合多源最短路,由於複雜度較高,適合資料較小的題目,但也有些題目可由floyd的變形去做。dijkstra演算法為單源最短路,主要...

最短路問題 小結

分類 小結 2014 06 06 14 57 93人閱讀收藏 舉報最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩結點之間的最短路徑。演算法具體的形式包括 確定起點的最短路徑問題 即已知起始結點,求最短路徑的問題。確定終點的最短路徑問題 與確定起點的問題相反,該問題...