Dijkstra算法优先队列优化求最短路径问题
——HM
Dijkstra算法是求最短路径问题的一个经典算法,除了SPFA应该是最常用的了,而SPFA很容易被卡,所以DIjkstra可以大展身手,(反正我是很常用Dijkstra,可能是我太蒻了吧)这里介绍一种优化Dijkstra算法的方法。
不知道Dijkstra算法的点这。
想了解Dijkstra堆优化的点这。
优先队列优化Dijkstra说白了就是在查找最短边时用优先队列存储。优先队列优化Dijkstra算法的精髓在于每次存储一次当前所遍历的边的信息,可以有效节约时间;同时,因为优先队列的优势,可以快速进行遍历找到最短路径,大大提高效率。
下面附上本人代码,由于本人太弱太懒,就是用STL,大佬们可以用手打的优先队列,会比我的更快一些。
AC代码:
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int SIZE=200005;
const int INF=0x3f3f3f3f;
int n,dis[SIZE],s,e;
struct node{
int num,v;
bool operator < (const node &a) const{
if(v==a.v)
return num<a.num;
return v>a.v;
}
}t;
vector<node> ga[200001];
void dijkstra(){
int i;
for(i=1;i<=n;i++)
dis[i]=INF;
dis[s]=0;
priority_queue<node> q;
t.num=s;
t.v=dis[s];
q.push(t);
while(!q.empty()){
node x=q.top();
q.pop();
for(i=0;i<ga[x.num].size();i++)
if(dis[ga[x.num][i].num]>x.v+ga[x.num][i].v){
dis[ga[x.num][i].num]=x.v+ga[x.num][i].v;
t.num=ga[x.num][i].num;
t.v=dis[ga[x.num][i].num];
q.push(t);
}
}
}
int main(){
int x,y,z,i;
cin >> n >> e >> s;
for(i=1;i<=e;i++){
cin >> x >> y >> z;
t.num=y;
t.v=z;
ga[x].push_back(t);
}
dijkstra();
for(i=1;i<=n;i++)
cout << dis[i] << ' ';
return 0;
}
感谢观看!