最短路--dijkstra+优先队列优化模板

不写普通模板了,还是需要优先队列优化的昂

 1 #include<stdio.h>        //基本需要的头文件
 2 #include<string.h>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 typedef pair<int,int> pii;
 8 const int INF=0x3f3f3f3f;
 9 
10 const int maxn=1e5+5;
11 const int maxm=1e5+5;
12 
13 int head[maxn],nxt[maxm<<1],val[maxm<<1],point[maxm<<1],size;
14 int dis[maxn];
15 
16 void init(){
17     memset(head,-1,sizeof(head));
18     size=0;
19 }
20 
21 void add(int a,int b,int v){    //若有向图则只需要前一半
22     point[size]=b;
23     val[size]=v;
24     nxt[size]=head[a];
25     head[a]=size++;
26 
27     point[size]=a;
28     val[size]=v;
29     nxt[size]=head[b];
30     head[b]=size++;
31 }
32 
33 struct cmp{                        //将优先队列改为小根堆
34     bool operator()(pii a,pii b){
35         return a.first>b.first;
36     }
37 };
38 
39 void dij(int s,int t){            //传入出发点和到达点
40     int i;
41     priority_queue<pii,vector<pii>,cmp>q;
42     q.push(make_pair(0,s));
43     memset(dis,0x3f,sizeof(dis));
44     dis[s]=0;
45     while(!q.empty()){
46         pii u=q.top();
47         q.pop();
48         if(u.first>dis[u.second])continue;
49         for(i=head[u.second];~i;i=nxt[i]){
50             int j=point[i];
51             if(dis[j]>u.first+val[i]){
52                 dis[j]=u.first+val[i];
53                 q.push(make_pair(dis[j],j));
54             }
55         }
56     }
57     printf("%d
",dis[t]);        //或去掉在主函数中输出或操作
58 }

最开始是因为寒假集训的时候学长讲的用pair存进优先队列的,实际上我更喜欢用结构体重载运算符来实现,所以也放上来。

另外……之前上面的代码里……有个size打成了sise,但是因为平时直接手敲,所以没有用这个贴过题,一直没有发现,甚至还看到有某些不明真相的网站把这篇复制粘贴过去了,非常的尴尬233333

反正我不尴尬啦

 1 #include<stdio.h>        //基本需要的头文件
 2 #include<string.h>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 const int INF=0x3f3f3f3f;
 7 
 8 const int maxn=1e3+5;
 9 const int maxm=1e5+5;
10 
11 struct pii{
12     int dis;
13     int s;
14     bool operator < (const pii x)const{
15         return dis > x.dis;
16     }
17     pii(int a,int b):dis(a),s(b){};
18 };
19 int head[maxn],nxt[maxm<<1],val[maxm<<1],point[maxm<<1],size;
20 int dis[maxn];
21 
22 void init(){
23     memset(head,-1,sizeof(head));
24     size=0;
25 }
26 
27 void add(int a,int b,int v){
28     point[size]=b;
29     val[size]=v;
30     nxt[size]=head[a];
31     head[a]=size++;
32 }
33 
34 void dij(int s,int t){            //传入出发点和到达点
35     int i;
36     priority_queue<pii>q;
37     q.push(pii(0,s));
38     memset(dis,0x3f,sizeof(dis));
39     dis[s]=0;
40     while(!q.empty()){
41         pii u=q.top();
42         q.pop();
43         if(u.dis>dis[u.s])continue;
44         for(i=head[u.s];~i;i=nxt[i]){
45             int j=point[i];
46             if(dis[j]>u.dis+val[i]){
47                 dis[j]=u.dis+val[i];
48                 q.push(pii(dis[j],j));
49             }
50         }
51     }
52     printf("%d
",dis[t]);        //或去掉在主函数中输出或操作
53 }
原文地址:https://www.cnblogs.com/cenariusxz/p/4454381.html