码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-02-13 22:48:22      阅读:358      评论:0      收藏:0      [点我收藏+]

标签:迪杰斯特拉   nbsp   cout   要求   时间   type   更改   typedef   选择   

例题链接

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

优化后的时间复杂度为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算法通用模板

标签:迪杰斯特拉   nbsp   cout   要求   时间   type   更改   typedef   选择   

原文地址:https://www.cnblogs.com/qingjiuling/p/10372123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!