Dijkstra 最短路還原路徑

2021-10-17 03:16:13 字數 1588 閱讀 3902

dijkstra鏈結

我們求最短路最常用的就是dijkstra演算法,然而我們在很多時候需要列印出這條最短的路徑,這時我們就要想乙個辦法來儲存路徑,這裡我們借助一點點類似於並查集的思想,就是用乙個path陣列來儲存從原點開始到達這個點的最短路徑的上一步,簡單來說就是我們從哪個點到的這個點,舉個例子吧:

假設我們已經知道 a->b->c->d 是a到d的最短路,那麼d是由誰到達的呢?顯然是c,那麼我們就令path[d] = c;,同理path[c] = b; path[b] = a;那麼由於我們是從a點出發,a點沒有上一步,所以我們令path[a] = -1;,這樣一條完整的路徑就能找到了。一步步的找他的「父親」,直到找到起點為止。

那麼這些節點是怎樣更新儲存的呢?我們想dijkstra的過程是怎樣的:如果從起點到a再到b比從起點到其他點再到b要近,也就是dist[b] > dist[a] + cost[a][b];那麼我們就要在這一步進行更新了,也就是在這一步我們到達b的方式變成了先到a再到b,由此可見我們應該是從這一步進行路徑的更新儲存,在更新dist[b]的同時也更新一下b的路徑:path[b] = a;其他**不變。

我們在進行路徑的輸出的時候需要用到棧這一結構,因為我們的path是從後往前進行查詢的,所以我們想要得到乙個從起點到終點的完整路徑,需要把我們從後往前找的路徑倒過來,所以我們需要用到棧(先進後出)。

完整**如下:

#include

#include

#include

using

namespace std;

int map[

10005][

10005];

long

long dist[

20001];

int vis[

20001];

int path[

20001];

int n,m;

int begin,end;

const

long

long inf =

2147483647

;void

dijkstra

(int node)

}int min =

0x7f7f7f7f

;int mini =-1

;for

(int i=

1;i<=n;i++)}

if(mini ==-1

)return

; vis[mini]=1

;dijkstra

(mini);}

intmain()

} dist[begin]=0

; vis[begin]=1

; path[begin]=-

1;dijkstra

(begin)

;for

(int i=

1;i<=n;i++

)while

(!s.

empty()

) cout << endl;}}

return0;

}

最短路 路徑還原(dijkstra,模板)

b.wzy的大冒險 出發咯qaq 單點時限 2.0 sec 記憶體限制 512 mb 第一行兩個數n,m 1 n 103,1 m 103 接下來m行,每行三個數x,y,z,表示點 x 與點 y 之間有一條權值為 z 的有向邊 1 x,y,z 103 第一行乙個整數表示 1 到 n 的最短距離 第二行...

Dijkstra 最短路徑

dijkstra 最短路徑 針對有向圖,不支援負權值 圖的相鄰矩陣表示方法,還要用到最小值堆 include include define unvisited 0 define visited 1 define infinite 9999 設定最大值 define n 5 定義圖的頂點數 using...

dijkstra最短路徑

hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外n 1個地方,這些地方都能互相到達,且所有的邊都是有方向的。現在hehe要做的事就是去那些地方找回那n 1件禮物給xixi 由於每一件禮物都有特殊的意義,所以xixi要求hehe每找到一件禮物,就必...