很多人也許學了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。但是每當我們的工作人員把上百件的衣服從商店運...