不写普通模板了,还是需要优先队列优化的昂
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 }