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每找到一件禮物,就必...