zoukankan      html  css  js  c++  java
  • [模板]洛谷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 }
  • 相关阅读:
    【SQL】含有NULL值的排序
    【SQL】结构化查询语言
    【Oracle】体系结构
    【PL/SQL】匿名块、存储过程、函数、触发器
    【Linux】VMware安装VMware Tools工具
    【SQL】INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND
    Tornado源码浅析
    【Python之路】特别篇--property()函数 和 @property 装饰符
    【Python之路】特别篇--生成器(constructor)、迭代器(iterator)、可迭代对象(iterable)
    【Python之路】特别篇--基于领域驱动模型架构设计的京东用户管理后台
  • 原文地址:https://www.cnblogs.com/running-coder-wfh/p/7517618.html
Copyright © 2011-2022 走看看