单源最短路径(dijkstra)新模板
#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]较小的点放在队头)。

浙公网安备 33010602011771号