單源最短路徑(dijkstra)新模板
阿新 • • 發佈:2021-07-20
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; const int maxn = 2e5+5; struct mint { int nxt, v, w; }e[maxn]; int head[100005], num = 0, s, n, m, dis[maxn]; bool vis[maxn]; inline void add(int u, int v, int w) { e[++num].nxt = head[u]; e[num].v = v; e[num].w = w; head[u] = num; } inline void dj() { memset(dis,0x3f,sizeof(dis)); dis[s] = 0; priority_queue<pair<int, int> >q; q.push(make_pair(0,s)); while(!q.empty()) { int u = q.top().second; q.pop(); if(vis[u]) continue; vis[u] = true; for(int i = head[u]; i;i = e[i].nxt) { int v = e[i].v; if(dis[v] <= dis[u] + e[i].w) continue; dis[v] = dis[u] + e[i].w; q.push(make_pair(dis[v],v)); } } } int main() { int a, b, c, k = 0; scanf("%d%d%d", &n, &m, &s); for(int i = 1;i <= m;++i) { scanf("%d%d%d", &a, &b, &c); add(a,b,c); if(k < a) k = a; if(k < b) k = b; } dj(); for(int i = 1;i <= k;++i) { printf("%d ", dis[i]); } return 0; }
與原板子的區別:沒有用過載運算子或者greater將priority_queue從大根堆改成小根堆。
而是在最後一步寫成push(makepair(-dis[v],v))。
這裡因為在下一次查詢中只會需要使用q.top().second即v,壓入-dis[v]對結果沒有影響
而且priotity_queue是大根堆,因此壓入-dis[v],能達成小根堆的效果(把dis[v]較小的點放在隊頭)。