堆优化的dijkstra算法

基于贪心思想,只适用于边长为非负数的图

O(mlogn)

算法流程

1.初始化的dist[1]=0,其余节点的dist为正无穷

2.找出一个未被标记、dist[x]最小的节点x并标记

3.扫描x的所有出边(x,y,z),若dist[y]>dist[x]+z,则更新dist[y]

4.重复2、3,直到所有节点被标记

//by ziwan Catherine
//堆优化dijkstra 边长为非负数 
//d[n]从起点到n的最短路 
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue> 
using namespace std; 
const int N=10010,M=1000010;
int head[N],ver[M],edge[M],next[M],d[N];
bool v[N];
int n,m,tot;
priority_queue< pair<int,int> > q;
//大根堆 优先队列 pair第一维为dist相反数(变成小根堆) 第二维为节点编号 
void dijkstra(){
	memset(d,0x3f,sizeof(d));
	d[1]=0;//dist初始化 起点为0,其余为正无穷
	memset(v,0,sizeof(v));//节点标记
	q.push(make_pair(0,1));
	while(q.size()){
		int x=q.top().second;q.pop();//取堆顶
		if(v[x]) continue;v[x]=1;
		for(int i=head[x];i;i=next[i]
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值