优先队列优化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算法通用模板的主要内容,如果未能解决你的问题,请参考以下文章