洛谷P4779 單源最短路徑與Dijkstra演算法

2022-09-20 21:09:17 字數 1435 閱讀 1894

(蒟蒻出品,歡迎指正)

dijkstra演算法(由於字母太多,以下統一用dij代替(逃

dij演算法,使用廣度優先搜尋與貪心演算法解決單源圖的最短路徑問題,不適用於有負權邊的圖。

時間複雜度:o(mlogn)//n為頂點數,m為邊數。

演算法思路:對於所需求解的圖,首先假設任意兩頂點之間距離為正無窮。然後開始加入邊,更新當前該源點到其餘頂點的最短距離,將沒有加入已知集合的距離最小的點選出,確定此點與源點最短距離,重複上述操作直到所有已知條件加入集合。

實現步驟

1,確定當前待求最短路徑的起點與終點;

2,將除起點外所有點加入未知集合,並將起點加入已知集合,直至確定該點到起點最短路徑;

3,依次更新起點到i的距離dis[i];

4,將未知集合dis中與起點距離最小x的加入已知集合;

5,同floyd演算法思想,若起點與n間距離大於起點到x距離加x到n距離,更新dis[n];

6,重複以上步驟直到終點進入已知集合,輸出答案;

當然若使用鄰接矩陣儲存是很慢的,為了優化時間及方便懶人,我們請出親愛的優先佇列與鏈式前向星幫助實現演算法。

於是板子題:應運而生。

1 #include2

#define ff(i,s,e) for(int i=s;i<=e;i++)

3using

namespace

std;

4 inline int

read()

8while(ch>='

0'&&ch<='9')

9return x*f;10}

11const

int m=500002;12

const

int inf=0x3f3f3f3f;13

intn,m,s;

14int

cnt,head[m];

15long

long dis[m];//

s到i最短路徑

16struct

egdee[m];

19 typedef pair pir;//

距離及當前所到點

20 priority_queue,greater>q;//

小根堆21

void add(int u,int v,int w)

27void dij(int

s)42}43

}44}45

intmain()

52dij(s);

53 ff(i,1,n) printf("

%lld

",dis[i]);

54return0;

55 }

感謝大佬@硫化氫提供的模板。

洛谷 P4779 模板 單源最短路徑(標準版)

求單源最短路徑。可以記住的模板有 堆優化的 dijkstra,bellman ford,spfa。堆優化的 dijkstra 演算法複雜度為 o e t dk v tem o e cdot t v cdot t o e tdk v tem 其中 e e e 是邊集大小,v v v 是點集大小,t d...

洛谷 P4779 模板 單源最短路徑(標準版)

洛谷 p4779 模板 單源最短路徑 標準版 2018 年 7 月 19 日,某位同學在 noi day 1 t1 歸程 一題裡非常熟練地使用了乙個廣為人知的演算法求最短路。然後呢?100 60 ag cu 最終,他因此沒能與理想的大學達成契約。小 f 衷心祝願大家不再重蹈覆轍。給定乙個 n 個點,...

洛谷P4779 模板 單源最短路徑(標準版)

2018 年 7 月 19 日,某位同學在 noi day 1 t1 歸程 一題裡非常熟練地使用了乙個廣為人知的演算法求最短路。然後呢?100 rightarrow 60100 60 ag rightarrow cuag cu 最終,他因此沒能與理想的大學達成契約。小 f 衷心祝願大家不再重蹈覆轍。...