# 最短路算法 堆优化 dijkstra+heap

1. 用STL的优先队列

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N=405;
struct rec
{
int v,w;
};
vector<rec> edge[N*N];
int n,st,ed;
__int64 dis[N*N];
bool vis[N*N];
struct cmp
{
bool operator()(int a,int b)
{
return dis[a]>dis[b];
}
};
void Dijkstra()
{
priority_queue<int,vector<int>,cmp> Q;
memset(dis,-1,sizeof(dis));
memset(vis,0,sizeof(vis));
int i,u,v;
Q.push(st);
dis[st]=0;
while(!Q.empty())
{
u=Q.top();
Q.pop();
vis[u]=0;
if(u==ed)
break;
for(i=0;i<edge[u].size();i++)
{
v=edge[u][i].v;
if(dis[v]==-1 || dis[v]>dis[u]+edge[u][i].w)
{
dis[v]=dis[u]+edge[u][i].w;
if(!vis[v])
{
vis[v]=1;
Q.push(v);
}
}
}
}
}

2.手动写堆

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N=405;
struct rec
{
int v,w;
};
vector<rec> edge[N*N];
int n,st,ed;
__int64 dis[N*N];
bool inHeap[N*N];
int heap[N*N];//存储节点id的堆
int inhp[N*N];//存储节点id在堆里面的位置
int size;//堆的大小
void upData(int x)
{
while(x>1)
{
int px=x>>1;
if(dis[heap[x]]<dis[heap[px]])
{
int temp;

inhp[heap[x]]=px;
inhp[heap[px]]=x;

temp=heap[x];
heap[x]=heap[px];
heap[px]=temp;

x=px;
}
else
break;
}
}
void downData(int x)
{
int lx,rx;
while(x<=size/2)
{
lx=x<<1;
rx=lx+1;
int sx=x;
if(lx<=size &&dis[heap[sx]]>dis[heap[lx]])
{
sx=lx;
}
if(rx<=size &&dis[heap[sx]]>dis[heap[rx]])
{
sx=rx;
}
if(sx==x)
break;
inhp[heap[x]]=sx;
inhp[heap[sx]]=x;

int temp=heap[x];
heap[x]=heap[sx];
heap[sx]=temp;
x=sx;
}
}
void Dijkstra()
{
memset(dis,-1,sizeof(dis));
memset(inHeap,0,sizeof(inHeap));
size=1;
heap[1]=st;
inhp[st]=1;
int i,u,v;
dis[st]=0;
while(size>0)
{
u=heap[1];
if(u==ed)
{
break;
}
int temp;
temp=heap[1];
heap[1]=heap[size];
heap[size]=temp;
inhp[heap[1]]=1;
size--;
downData(1);
inHeap[u]=false;
for(i=0;i<edge[u].size();i++)
{
v=edge[u][i].v;
if(dis[v]==-1 || dis[v]>dis[u]+edge[u][i].w)
{
dis[v]=dis[u]+edge[u][i].w;
if(!inHeap[v])
{
inHeap[v]=true;
size++;
heap[size]=v;
inhp[v]=size;
upData(size);
}
else
{
upData(inhp[v]);
}
}
}
}

} 

• 本文已收录于以下专栏：

## 关于dijkstra+heap的实现

• biran007
• 2009年04月17日 18:56
• 2717

## 二之三续、Dijkstra 算法+Heap堆的完整c实现源码

• qingyuanluofeng
• 2015年08月26日 09:53
• 706

## dijkstra算法O(n²) 堆优化O（nlogn）

• DCrusher
• 2015年11月05日 21:51
• 5722

## Heap+Dijkstra堆优化的Dijkstra

• u011333588
• 2015年05月11日 08:19
• 3609

## 再谈Dijkstra算法和堆优化

• major_zhang
• 2017年05月19日 10:47
• 1565

## 单源最短路径（堆优化的Dijkstra算法）

Dijkstra算法：设初始节点为v,起始节点到其他节点u的距离为图中v到u的直接线路的距离，如果v和u之间没有直接线路，则d[u]=INF(无穷大)。初始化S={v},寻找最短路径（即在d[]中寻找...
• qianchangdiyin
• 2015年03月15日 20:45
• 1835

## 单源最短路 dijkstra + heap 实现

/** 再写一篇睡觉，正好把刚刚的优先队列用下。。 前面再说单源最短路径的时候用到dijkstra 算法，现在介绍下 它的优化版，传说中的 O(N*log(E)) ...
• zcube
• 2015年09月05日 10:10
• 1317

## Dijkstra+堆优化

• Fgaoshihao
• 2016年11月18日 08:32
• 4025

## Dijkstra堆优化学习

• yekehe2002
• 2017年07月31日 22:10
• 128

## Dijkstra + 堆优化

Dijkstra算法原理请见：最短路径问题（Dijkstra解法） 该算法对于稠密图更加有效： 对于给出具有非负权重的边和源顶点S的图G，算法可在O（mlogn）时间内找出从s点到其他每一...
• jokes000
• 2012年05月04日 11:27
• 13398

举报原因： 您举报文章：最短路算法 堆优化 dijkstra+heap 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)