优先队列优化dij算法通用模板

Posted qingjiuling

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优先队列优化dij算法通用模板相关的知识,希望对你有一定的参考价值。

例题链接

分析:迪杰斯特拉算法的核心思想就是每次选择最短的距离,用这个最短距离来更新相邻顶点的最短距离,并且在更新完毕后这个最短距离不需要再考虑,而优先队列恰好契合迪杰斯特拉算法的要求,用来优化正合适

优化后的时间复杂度为O(E log V)。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int inf=1<<30;
 4 typedef long long ll;
 5 const double pi=acos(-1);
 6 const int mod=1e9+7;
 7 const int maxn=1e5+7;
 8 int n,p,k;
 9 typedef pair<int ,int> P;
10 struct edge{
11     int to,cost;
12     edge(int y,int z):to(y),cost(z){}
13 }; 
14 int  dis[maxn];//用来记录从顶点出发到各个点的最短距离 
15 vector<edge> g[maxn];
16 void dij(int p){
17     priority_queue<P,vector<P>,greater<P>> que;//优先队列默认从大到小,更改为从小到大 
18     fill(dis,dis+n+1,inf);//一步步更新一定要记得一开始赋为无穷大 
19     dis[p]=0;
20     que.push(P(0,p));
21     while(!que.empty()){
22         P p=que.top();que.pop();
23         int v=p.second;
24         if(dis[v]<p.first) continue;//当取出的最小值不是最短距离的话,就丢弃这个值(因为我们本意是用最短距离来不断更新)
25         for(int i=0;i<g[v].size();i++){
26             edge e=g[v][i];
27             if(dis[e.to]>dis[v]+e.cost){
28                 dis[e.to]=dis[v]+e.cost;
29                 que.push(P(dis[e.to],e.to));
30             }
31         } 
32     }
33 }
34 int main(){
35     scanf("%d%d%d",&n,&p,&k);
36     for(int i=1;i<n;i++){
37         int x,y,z;scanf("%d%d%d",&x,&y,&z);
38         g[x].push_back(edge(y,z));
39         g[y].push_back(edge(x,z)); 
40     }
41     dij(p);
42     sort(dis+1,dis+n+1);
43     cout<<dis[k+1]<<endl;
44     return 0;
45 }

 

以上是关于优先队列优化dij算法通用模板的主要内容,如果未能解决你的问题,请参考以下文章

最短路径dijs+优先队列 模板

DIJ的优化,和spfa的优化

dijkstra算法模板(优先队列优化)

常用最短路优化算法及例题(附模板)——-SPFA和Dijkstra

图论-最短路Dijkstra算法详解超详 有图解

Dijkstra算法介绍及其优先队列优化和斐波那契堆优化