[模板]洛谷T3371 单源最短路径 SPFA+手工队列类

一年之后又重新学习此算法。。。233。。。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<ctime>
  6 #include<cstdlib>
  7 
  8 #include<string>
  9 #include<stack>
 10 //#include<queue>
 11 #include<vector>
 12 #include<algorithm>
 13 #include<map>
 14 #include<set>
 15 
 16 using namespace std;
 17 
 18 inline void read(int &x){
 19     x=0;
 20     char t=getchar();
 21     bool f=0;
 22     
 23     while(t<'0' || t>'9'){
 24         if(t=='-')f=1;
 25         t=getchar();
 26     }
 27     
 28     while(t>='0' && t<='9'){
 29         x=(x<<3)+(x<<1)+t-'0';
 30         t=getchar();
 31     }
 32     
 33     if(f)x=-x;
 34 }
 35 
 36 struct que{
 37     int head,tail;
 38     int q[10001];
 39     
 40     void build(){
 41         head=0;
 42         tail=0;
 43     }
 44     
 45     bool emp(){
 46         return head==tail;
 47     }
 48     
 49     void push(int x){
 50         q[tail]=x;
 51         tail++;
 52         if(tail==10001)tail=0;
 53     }
 54     
 55     void pop(){
 56         head++;
 57         if(head==10001)head=0;
 58     }
 59     
 60     int end(){
 61         if(tail==0)return q[10000];
 62         else return q[tail-1];
 63     }
 64     
 65     int begin(){
 66         return q[head];
 67     }
 68 };
 69 
 70 void start();
 71 void SPFA();
 72 
 73 que line;
 74 bool pd[10010];
 75 int d[10010];
 76 
 77 int u[500010];
 78 int v[500010];
 79 int w[500010];
 80 int first[10010];
 81 int next[500010];
 82 
 83 int n,m,s,i;
 84 
 85 int main(){
 86     start();
 87     
 88     read(n);read(m);read(s);
 89     
 90     for(i=1;i<=m;i++){
 91         read(u[i]);read(v[i]);read(w[i]);
 92         next[i]=first[u[i]];
 93         first[u[i]]=i;
 94     }
 95     
 96     SPFA();
 97     
 98     for(i=1;i<=n;i++){
 99         if(d[i]!=0x3f3f3f3f)printf("%d ",d[i]);
100         else printf("2147483647 ");
101     }
102     
103     return 0;
104 }
105 
106 void start(){
107     line.build();
108     memset(pd,0,sizeof(pd));
109     memset(d,0x3f3f3f3f,sizeof(d));
110     
111     memset(first,0,sizeof(first));
112     memset(next,0,sizeof(next));
113 }
114 
115 void SPFA(){
116     int t;
117     
118     line.push(s);
119     pd[s]=1;
120     d[s]=0;
121     
122     while(!line.emp()){
123         t=first[line.begin()];
124         while(t!=0){
125             if(d[v[t]]>d[u[t]]+w[t]){
126                 d[v[t]]=d[u[t]]+w[t];
127                 if(pd[v[t]]==0){
128                     line.push(v[t]);
129                     pd[v[t]]=1;
130                 }
131             }
132             t=next[t];
133         }
134         pd[line.begin()]=0;
135         line.pop();
136     }
137 }
原文地址:https://www.cnblogs.com/running-coder-wfh/p/7517618.html