最短路演算法

2021-08-28 06:39:50 字數 3138 閱讀 7792

參考

一、dijkstar(迪傑斯特拉)演算法:

簡介:此演算法按路徑長度(next點)遞增順序產生最短路。

步驟:1.先將點集v分成兩組:

·s:已求出最短路徑的集合

·t:v-s(尚未確定最短路徑的集合)

2.初始化

使s = ,t=,t中頂點對應的距離值,若存在,則為弧上的權值,如不存在則為inf(無窮)。

3.從t中選區乙個距離最小值w(貪心),加入s,對t中頂點的距離值進行修改,若w作為中間點反而比v0到vi的距離長則修改此距離。

4.重複上述步驟,直到s中包含所有點為止。

ps:dijkstar無法處理負權邊。

二、floyd演算法

思想:從a節點到b節點只有兩種方式:1.直接從a到b。2.間接(中間經歷若干節點)到b。

如果distance(ak)+distance(kb)**如下:

for(int k = 0;kfor(int i =0;jfor(int j = 0;jif(!(dist[i][k] == inf || dist[k][j] ==inf)&&(dist[i][k]+dist[k][j]dist[i][j] =dist[i][k] + dist[k][j];

三、bellman-ford(貝爾曼-福特)演算法

簡介:不停地進行鬆弛直到n-1次,如果n-1此還能鬆弛則說明有負環,此演算法無法解出。

可以求邊上帶有負值,但不能求負環,且效率很低不想考慮,直接學習用佇列優化的bf演算法:spfa

ps:dijkstar演算法與bellman-ford的不同:

dijkstar:起點到s集合內的最短路徑求出後不再改變,只有t集合裡面的長度改變(貪心演算法)。

bellman-ford:每次迴圈都要改dist直到演算法結束。

演算法使用條件:

1.單元最短路徑

2.有向圖和無向圖(無向圖可以看作為(u,v),(v,u)同屬於邊集e的有向圖)

3.邊權可正可負(如有負權迴路輸出錯誤資訊)。

4.差分約束系統。

四、spfa演算法(缺點:複雜度高,不過可以優化)

用佇列優化bf演算法。

步驟:1.先將每個節點存成估計值(起點為零,其餘為inf)儲存在陣列dis中,用鄰接表儲存圖,採用動態逼近法:建立乙個佇列儲存待優化的節點,每次優化化時從隊首取出節點u,用當前u點的最短路徑的估計值對離開u點所指的v點進行鬆弛操作,如果v點的最短路徑估計值變短了,且不在佇列中,將其加入隊尾,這樣不斷取出節點進行鬆弛操作,直至隊列為空。

2.在執行第一步之前需要先判斷是否有負環:

a.採用拓撲排序,時間很長,一般不用。

b.如果某個節點進入佇列次數超過n則存在負環(n為頂點數)。

首先建立起始點a到其餘各點的

最短路徑**

首先源點a入隊,當佇列非空時:

1、隊首元素(a)出隊,對以a為起始點的所有邊的終點依次進行鬆弛操作(此處有b,c,d三個點),此時路徑**狀態為:

首先源點a入隊,當佇列非空時:

1、隊首元素(a)出隊,對以a為起始點的所有邊的終點依次進行鬆弛操作(此處有b,c,d三個點),此時路徑**狀態為:

在鬆弛時三個點的最短路徑估值變小了,而這些點佇列中都沒有出現,這些點

需要入隊,此時,佇列中新入隊了三個結點b,c,d隊首元素b點出隊,對以b為起始點的所有邊的終點依次進行鬆弛操作(此處只有e點),此時路徑**狀態為:

在最短路徑表中,e的最短路徑估值也變小了,e在佇列中不存在,因此e也要

入隊,此時佇列中的元素為c,d,e隊首元素c點出隊,對以c為起始點的所有邊的終點依次進行鬆弛操作(此處有e,f兩個點),此時路徑**狀態為:

在最短路徑表中,e,f的最短路徑估值變小了,e在佇列中存在,f不存在。因此e不用入隊了,f要入隊,此時佇列中的元素為d,e,f

隊首元素d點出隊,對以d為起始點的所有邊的終點依次進行鬆弛操作(此處只有g這個點),此時路徑**狀態為:

在最短路徑表中,g的最短路徑估值沒有變小(鬆弛不成功),沒有新結點入隊,佇列中元素為f,g

隊首元素f點出隊,對以f為起始點的所有邊的終點依次進行鬆弛操作(此處有d,e,g三個點),此時路徑**狀態為:

在最短路徑表中,e,g的最短路徑估值又變小,佇列中無e點,e入隊,佇列中存在g這個點,g不用入e,此時佇列中元素為g,e隊首元素g點出隊,對以g為起始點的所有邊的終點依次進行鬆弛操作(此處只有b點),此時路徑**狀態為:

在最短路徑表中,b的最短路徑估值又變小,佇列中無b點,b入隊,此時佇列中元素為e,b

隊首元素e點出隊,對以e為起始點的所有邊的終點依次進行鬆弛操作(此處只有g這個點),此時路徑**狀態為:

在最短路徑表中,g的最短路徑估值沒變化(鬆弛不成功),此時佇列中元素為b

隊首元素b點出隊,對以b為起始點的所有邊的終點依次進行鬆弛操作(此處只有e這個點),此時路徑**狀態為:

在最短路徑表中,e的最短路徑估值沒變化(鬆弛不成功),此時隊列為空了

最終a到g的最短路徑為14

****

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

最短路演算法

常用的最短路演算法有三種 disjkstra,floyd,ballman floyd 一 disjkstra演算法 dijkstra演算法要求圖上的權非負數。同樣使用於無向圖 html view plain copy include stdio.h hdu 2544 define maxsum 0x...

最短路演算法

最短路演算法有很多,具體哪個好,和資料是有很大關係的 從起點開始向外擴充套件,最壞o v e 實際體驗比o e log v 的dijkstra可能快 include include define max e 4002 define max v 1002 define inf 0x3f3f3f usi...