參考
一、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...