ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

dijkstra算法+堆优化 + 链式前向星版本

2021-07-27 17:34:42  阅读:232  来源: 互联网

标签:PII pq dist idx int dijkstra 松弛 链式 前向星


dijkstra算法+堆优化 + 链式前向星版本

堆优化版本结构简述

typedef pair一下 PII

邻接矩阵、邻接表或链式前向星add一下来建图

void dijkstra(int s){
     小根堆走起
     给dist数组都赋值为无穷大(memset一下),
     让起点拥有一个表现的机会(赋值为0,且压入小根堆里面,push(PII(0,s)))first为距离,second为位置
     while一下,直到无路可走或者通关
     {
          提取当前距离到起点最短的点
          现提取出来的点的距离可能被上一个点给松弛掉了,直接continue(因为压入的是pair对,距离是当时的距离,不是最近更新的距离,而如果以原本的距离来对往后相连接的点再做一次松弛操作,将不具有最优的最短的距离,应该选择等待新松弛掉的这个点的新数据来对往后的点进行更新)
          
          for循环一下,将所连接的点都进行一次更新
          如果有所松弛,松弛掉的点就存在可能能够对其后续所连接的点的距离松弛的可能,因而就有必要将这个被当前结点松弛掉的点加入小根堆里面。
     }
     
}

代码

int h[N],ne[M],w[M],e[M],idx=0;//ne和e都表示的是边,h表示的是点   
void add(int a,int b,int c)
{
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
typedef pair<int,int > PII;
int dist[N];
int dijkstra(int st,int ed)
{
	priority_queue<PII,vector<PII>,greater<PII> > pq;
	memset(dist,0x3f,sizeof(dist));
	
	pq.push(PII(0,st));
	dist[st]=0;
	while(pq.size())
	{
		PII t = pq.top();
		pq.pop();
		int d = t.first,u = t.second;
		if(d>dist[u])continue;
		
		for(int i = h[u];~i;i=ne[i])
		{
			int j = e[i];
			if(dist[j]>d+w[i])
			{
				dist[j]=d+w[i];
				pq.push(PII(dist[j],j));
			}
		}
	}
	if(dist[ed]==0x3f3f3f3f) return -1;
	else return dist[ed];
}

标签:PII,pq,dist,idx,int,dijkstra,松弛,链式,前向星
来源: https://www.cnblogs.com/BeautifulWater/p/15066996.html

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

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

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

ICode9版权所有