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

2021-09-25 20:43:53 字數 1042 閱讀 5307

很多人也許學了spfa,覺得簡單方便,然而呢,spfa的複雜度是o(玄學),容易被出題人出資料卡,於是我們要學用優先佇列優化的dij。

如果大家理解dij演算法的核心,那麼也會很容易理解為什麼優先佇列可以優化的。

沒優化前的dij,我們每次鬆弛都要遍歷1→n

1 \to n

1→n,來找到dis

[i

]dis[i]

dis[i]

最小的點,而總共要鬆弛n−1

n-1n−

1次,複雜度是o(n

2)

o(n^2)

o(n2)。

用優先佇列,相當於把遍歷的過程省去了,隊首就是當前dis[i](1≤

i≤n)

(1\leq i \leq n)

(1≤i≤n

)最小的點 a

aa,把複雜度降到了o(l

og2n

)o(log_2n)

o(log2

​n)值得一提的是,dij演算法只能用於非負權圖

#include #include #include #include #include #define n 200005

#define inf 2147483647

using namespace std;

struct node

}d[n], e;

int h[n], dis[n], cnt;

priority_queueq;

void cr(int a, int b, int c)

int main()

for(i = 1; i <= n; i++) dis[i] = inf;

dis[s] = 0;

e.a = s, e.c = 0;

q.push(e);

while(!q.empty())

} }for(i = 1; i <= n; i++) printf("%d ", dis[i]);

return 0;

}

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

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

單源最短路徑 Dijkstra 優先佇列

1找到最短距離已經確認的頂點,從它出發更新相鄰頂點的最短距離 2此後不需要關心1中的 最短距離已經確認的頂點 堆中元素共有o v 個,更新和取出都有o e 次,每次更新或取出堆的維護時間是o lo 因此該演算法的時間複雜度為o elo 輸入兩個整數v,e,分別表示有向圖 無向圖就多新增一倍的邊 的的...

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

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