简单介绍
Dijkstra算法是单源最短路算法,采用贪心思想。
假设图有n个顶点,从源点1出发,计算其他各个顶点距离源点1的最短路径。使用dis数组存储各个点距离源点1的距离,初始化dis[1]为0,其他为
+
∞
+\infty
+∞。算法步骤如下:
该算法需要保证已经扩展的点,在后续边松弛过程中距离不会被更新,所以图中不能有负权边。
如果存在负权边,通过负权边访问扩展过的点,会导致该点的距离被更新。如图:
代码
附上堆优化的dijkstra代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define E 200010
#define V 100010
using namespace std;
struct edge
{
int to,w;
};
/*v表示顶点,d表示距离*/
struct path
{
int v, d;
bool operator < (const path &p) const
{
return d>p.d;
}
};
priority_queue<path> pque;
vector<edge> G[V];//下标表示顶点,值表示从该顶点出发的边的数组。
int n,m,s;
int dis[V],book[V];
const int INF=2147483647;
void dijkstra()
{
int minn,u;
path p={s,dis[s]};
pque.push(p);
while(!pque.empty())
{
path tmp=pque.top();pque.pop();
if (book[tmp.v]) continue;
book[tmp.v]=1;
for (int i=0;i<G[tmp.v].size();i++)
{
if (dis[G[tmp.v][i].to]>dis[tmp.v]+G[tmp.v][i].w)
{
dis[G[tmp.v][i].to]=dis[tmp.v]+G[tmp.v][i].w;
pque.push({G[tmp.v][i].to,dis[G[tmp.v][i].to]});
}
}
}
}