用優先佇列實現最短路

2021-10-06 04:10:23 字數 3483 閱讀 9523

最短路其實一開始我也不會,感覺,這都是什麼啊,好複雜。?

?然後自己給自己製造心理負擔。

然後經過若干次的逛b站終於找到乙個大佬,燈神!!!!

然後我我終於弄懂了最短路,嗚嗚~~。

然後又是幾個小時的瘋狂debug!!!然後發現最後的錯誤竟然的陣列初始化??!!!

難道我把基礎給丟了??

別說了,我已經哭暈在廁所?

最後…又是若干次coding,終於!!!

success ?幸運女神的偏愛讓我受寵若驚?

上面的是幾個小時的心情?,我現在真開心,畫了兩個小時的圖,然後。。。

我還能說點啥,,

雖然換個軟體大部分資料都沒有丟但是!!!!

我現在心情比較複雜?

俗話說得好,先畫圖?

那麼我們就塑造乙個圖形?來人,上圖?

因為是另外乙個軟體轉換的,這個畫質,,,我枯遼。?

看看這樣精美的圖,可惜了我丟失的資料!!!!啊啊啊啊,誰能告訴我別的畫圖軟體!!

這肯定是魔化的最短路徑演算法,這裡呢,我們用到了一種特殊的資料結構優先佇列

名字備註

parents

儲存當前結點的父親

weight

表示起點到達該點所需要的權值

優先佇列

一種資料結構,這個地方每次都取權值最小的乙個點

這個地方我們的起點是a終點是f

首先我們起點先入隊。

然後此時a結點的父親就是自己。

權值為0;

首先我們先從佇列中取出乙個元素。也就是隊首元素

然後找到與之相鄰的邊,而且邊上的另乙個頂點沒有被訪問過。

這個時候我們發現與a相連的頂點且沒有被訪問的是b and c

到b 的距離是5, 到c的距離是1

這個時候我們其實可以發現 b 是由 a 點經過的。也就是 a - > b 所以 b的父親是a,距離就是a->b的距離 + a的權值 0.

這個時候a點已經被訪問過啦,所以我們要把a點標記或者去除

然後繼續取出優先佇列隊首的元素

找到與c相鄰但是沒有別訪問的頂點

這個時候一定要注意b這個點

具體分析:我們會發現,我們第一次標記b的時候,也就是a->b的權值是5,但是對於頂點c也能夠訪問到b點,權值就是c的權值加上c->b的權值。這個地方就等價於a->c->b = 3,權值更小,這說明對於起點a來說,到達b的路徑中,存在著一條更短的路徑,權值為3,所以我們要更新weight[c],同時我們會發現,c訪問的b,那不就是說,b的父親是c嗎,所以我們需要更新這兩個。

對於頂點d and e來說,那就比較簡單了。

直接新增父親結點。

新增權值資訊。

注意:這個時候我們需要把剛剛的bde三個點和附帶的權值資訊重新新增進入優先佇列。

這個時候,因為是優先佇列,所以會按照權值大小順序,自動排序。

同時因為c點已經訪問了,所以一定要標記。

繼續從佇列中獲取結點b

找到b相連線的沒有被訪問的結點。更新權值資訊。

具體分析:我們會發現,我們第一次標記d的時候,也就是c->d的權值是5,但是對於頂點b也能夠訪問到d點,權值就是b的權值加上b->d的權值。這個地方就等價於a->c->b->d = 4,權值更小,這說明對於起點a來說,到達d的路徑中,存在著一條更短的路徑,權值為4,所以我們要更新weight[d],同時我們會發現,b訪問的d,那不就是說,d的父親是b嗎,所以我們需要更新這兩個。

不要忘記把對應的 (d, 4)重新放回優先佇列。

取出結點d。

更新對應的e and f點的資訊

標記d點,同時把(e,7)(f,10)入隊

重點來了!!!!!!!此時我們出隊的話,會發現,隊首是b。

但是b已經被訪問過了,所以出隊直接丟棄,同理d也是如此,e和f已經不能訪問到任何其它頂點,所以到這個地方,都是出隊的操作了。但是方法還跟上面一樣,唯一需要記得的就是b點的情況,出隊的頂點已經被訪問,直接丟棄。

因為軟體崩潰資料丟失,上面的是另乙個軟體轉換的。所以不在展示。

已經找到最短路徑了,該怎麼求得路徑呢?

我們知道結束的點是 f

f 的父親是 d

d 的父親是 b

b 的父親是 c

c 的父親是 a

所以我們可以發現答案是 a -> c -> b -> d -> f

最短路徑是 10

最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路徑。演算法具體的形式包括:

確定起點的最短路徑問題 - 即已知起始結點,求最短路徑的問題。適合使用dijkstra演算法。

確定終點的最短路徑問題 - 與確定起點的問題相反,該問題是已知終結結點,求最短路徑的問題。在無向圖中該問題與確定起點的問題完全等同,在有向圖中該問題等同於把所有路徑方向反轉的確定起點的問題。

確定起點終點的最短路徑問題 - 即已知起點和終點,求兩結點之間的最短路徑。

全域性最短路徑問題 - 求圖中所有的最短路徑。適合使用floyd-warshall演算法。

難受,相當難受,軟體崩潰,還好修復回來了部分資料,太難受了,差點所有的資料都丟失?.如果覺得有幫助,可以給我乙個小心心嗎。?

最短路(dij 優先佇列優化)模板

有n個城市,求s到e的最短路徑 當n的值較小時,直接用 dij 演算法沒有問題,但是當數值較大或者訪問過多時就需要優化 演算法思想 貪心,從起點開始,不斷的尋找不同點到起始點的最短距離 鏈結一篇部落格 新增鏈結描述 include include include include include in...

迷宮最短路徑的C 實現(佇列 廣度優先)

include include includeusing namespace std struct point int main cout for i 0 i col 2 i for i 1 i row 1 i queueq point start point malloc sizeof point...

HDOJ 2544 最短路(DIJ 優先佇列)

最短路 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運...