优先队列优化dij算法

之前已经弄过模板了,但那个复杂一点,这个就是裸的dij,用起来更方便

输入格式:n,m,s,d分别是点数,边数,起点,终点

之后m行,输入x,y,z分别是两点即权值

题目链接:https://www.luogu.org/problemnew/show/P1339

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int inf=1<<30;
 4 typedef long long ll;
 5 typedef pair<int,int> P;
 6 const double pi=acos(-1);
 7 const int mod=1e8+7;
 8 const int maxn=2600;
 9 const int maxm=6300;
10 int dis[maxn];
11 struct edge{
12     int to,cost;
13 };
14 vector<edge> g[maxm];
15 void dij(int s){
16     priority_queue<P,vector<P>,greater<P> > que;
17     fill(dis,dis+maxn,inf);
18     dis[s]=0;
19     que.push({0,s});
20     while(!que.empty()){
21         P p=que.top();que.pop();
22         int v=p.second;
23         if(dis[v]<p.first) continue;
24         for(int i=0;i<g[v].size();i++){
25             edge e=g[v][i];
26             if(dis[e.to]>dis[v]+e.cost){
27                 dis[e.to]=dis[v]+e.cost;
28                 que.push({dis[e.to],e.to});
29             }
30         }
31     }
32 }
33 int main(){
34     int x,y,z,n,m,s,d;scanf("%d%d%d%d",&n,&m,&s,&d);
35     for(int i=0;i<m;i++){
36         scanf("%d%d%d",&x,&y,&z);
37         g[x].push_back({y,z});
38         g[y].push_back({x,z});
39     }
40     dij(s);
41     cout<<dis[d]<<endl;
42     return 0;
43 }

 

posted @ 2019-03-04 20:01  清酒令  阅读(985)  评论(0编辑  收藏  举报