单源最短路径(dijkstra)新模板

时间:2021-07-20
本文章向大家介绍单源最短路径(dijkstra)新模板,主要包括单源最短路径(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]较小的点放在队头)。

原文地址:https://www.cnblogs.com/mint-hexagram/p/15035354.html