#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]较小的点放在队头)。