(蒟蒻出品,歡迎指正)
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 衷心祝願大家不再重蹈覆轍。...