ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

模板——dijkstra单源最短路

2020-07-11 09:37:01  阅读:276  来源: 互联网

标签:int 单源 tot dijstra dijkstra maxm include 模板 dis


传送门:https://www.luogu.com.cn/problem/P4779

dijstra 算法用于对单源最短路的求解问题,运用堆优化后,可以在O\((({n}+{m})\times\log_2{n})\)的复杂度内解决两点之间的最短路问题

实现方法:

*dijstra 算法基于贪心的思想实现
*对于一个未更新的权值最小的节点x,将其标记为已走过,对于该节点x的所有出边y,边权为z,若存在 d[y]>d[x]+z,则令d[y]=d[x]+z,进行更新
*重复上述步骤,直至所有的节点均被标记

dijstra不适合用于存在负边权的图中

dijstra运用堆优化,可以有效地避免对其他无关的边进行的冗余运算,可以有效地提升其运算复杂度

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<queue>
#define ll long long
using namespace std;

const ll maxm=2e5+10;
int n,m,s,tot;
int edge[maxm],ver[maxm],next[maxm],head[maxm],v[maxm],dis[maxm];
priority_queue<pair<int,int> > q;

inline void add(const int u,const int v,const int w)\\邻接表存图,可以用vector代替
{
	ver[++tot]=v;
	edge[tot]=w;
	next[tot]=head[u];
	head[u]=tot;
}

inline void dij(int x)
{
	memset(dis,0x3f,sizeof(dis));\\初始化边权值
	memset(v,0,sizeof(v));
	dis[x]=0;
	q.push(make_pair(0,1));\\优先队列实现堆优化dijstra
	while(q.size()!=0)
	{
		int x=q.top().second;
		q.pop();
		if(v[x]==1) continue;
		v[x]=1;
		for(int i=head[x];i;i=next[i])
		{
			int y=ver[i];
			int z=edge[i];
			
			if(dis[y]>dis[x]+z)
			{
				dis[y]=dis[x]+z;
				q.push(make_pair(-dis[y],y));
			}
		}
	}
}

int main(void)
{
	scanf("%d%d%d",&n,&m,&s);
	
	for(int x,y,z;m;m--)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
	}
		
	dij(s);
	
	for(int i=1;i<=n;i++)
	{
		printf("%d ",dis[i]);
	}
	
	return 0;
}

标签:int,单源,tot,dijstra,dijkstra,maxm,include,模板,dis
来源: https://www.cnblogs.com/jd1412/p/13282446.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有