• speedcell's SPFA


    版权永久属于speedcell,神代码,给跪了……yr酱V5……

    这东西虽然还没有学,先收藏起来~

    多谢yr酱……O(∩_∩)O哈哈~

      1 /*
      2  Author : Speedcell
      3  Update : 2013-03-24
      4 Version : soppYcell 2.1(a)
      5 */
      6 
      7 #include <algorithm>
      8 #include <iostream>
      9 #include <fstream>
     10 #include <sstream>
     11 #include <iomanip>
     12 
     13 #include <map>
     14 #include <set>
     15 #include <list>
     16 #include <stack>
     17 #include <queue>
     18 #include <deque>
     19 #include <vector>
     20 #include <string>
     21 #include <bitset>
     22 #include <memory>
     23 #include <complex>
     24 #include <numeric>
     25 
     26 #include <stdio.h>
     27 #include <stdlib.h>
     28 #include <string.h>
     29 #include <math.h>
     30 #include <time.h>
     31 #include <ctype.h>
     32 #include <locale.h>
     33 
     34 using namespace std;
     35 
     36 #pragma pack(4)
     37 
     38 #ifndef __CONSTANT__
     39 #define __CONSTANT__
     40 
     41 typedef long long LONG;
     42 
     43 const double pi = acos(-1.0);
     44 const int   inf = 0x7f7f7f7f;
     45 const LONG  INF = 0x7f7f7f7f7f7f7f7fll;
     46 
     47 const int go[8][2] = {{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
     48 
     49 #endif // __CONSTANT__
     50 
     51 #ifndef __IO__
     52 #define __IO__
     53 
     54 inline bool RD(int    & a) {return scanf("%d",&a)!=EOF;}
     55 inline bool RD(char   & a) {return scanf("%c",&a)!=EOF;}
     56 inline bool RD(char   * a) {return scanf("%s", a)!=EOF;}
     57 inline bool RD(double & a) {return scanf("%lf",&a)!=EOF;}
     58 inline bool RD(LONG   & a) {return scanf("%I64d",&a)!=EOF;}
     59 
     60 template<class T1> inline bool
     61     IN(T1 & a) {return RD(a);}
     62 template<class T1,class T2> inline bool
     63     IN(T1 & a,T2 & b) {return RD(a)&&RD(b);}
     64 template<class T1,class T2,class T3> inline bool
     65     IN(T1 & a,T2 & b,T3 & c) {return RD(a)&&RD(b)&&RD(c);}
     66 template<class T1,class T2,class T3,class T4> inline bool
     67     IN(T1 & a,T2 & b,T3 & c,T4 & d) {return RD(a)&&RD(b)&&RD(c)&&RD(d);}
     68 template<class T1,class T2,class T3,class T4,class T5> inline bool
     69     IN(T1 & a,T2 & b,T3 & c,T4 & d,T5 & e) {return RD(a)&&RD(b)&&RD(c)&&RD(d)&&RD(e);}
     70 template<class T1,class T2,class T3,class T4,class T5,class T6> inline bool
     71     IN(T1 & a,T2 & b,T3 & c,T4 & d,T5 & e,T6 & f) {return RD(a)&&RD(b)&&RD(c)&&RD(d)&&RD(e)&&RD(f);}
     72 template<class T1,class T2,class T3,class T4,class T5,class T6,class T7> inline bool
     73     IN(T1 & a,T2 & b,T3 & c,T4 & d,T5 & e,T6 & f,T7 & g) {return RD(a)&&RD(b)&&RD(c)&&RD(d)&&RD(e)&&RD(f)&&RD(g);}
     74 
     75 inline void PT(int    a) {printf("%d",a);}
     76 inline void PT(char   a) {printf("%c",a);}
     77 inline void PT(double a) {printf("%f",a);}
     78 inline void PT(LONG   a) {printf("%I64d",a);}
     79 inline void PT(string a) {printf("%s",a.begin());}
     80 
     81 template<class T1> inline void
     82     OT(T1 a) {PT(a);}
     83 template<class T1,class T2> inline void
     84     OT(T1 a,T2 b) {PT(a),PT(' '),PT(b);}
     85 template<class T1,class T2,class T3> inline void
     86     OT(T1 a,T2 b,T3 c) {PT(a),PT(' '),PT(b),PT(' '),PT(c);}
     87 template<class T1,class T2,class T3,class T4> inline void
     88     OT(T1 a,T2 b,T3 c,T4 d) {PT(a),PT(' '),PT(b),PT(' '),PT(c),PT(' '),PT(d);}
     89 template<class T1,class T2,class T3,class T4,class T5> inline void
     90     OT(T1 a,T2 b,T3 c,T4 d,T5 e) {PT(a),PT(' '),PT(b),PT(' '),PT(c),PT(' '),PT(d),PT(' '),PT(e);}
     91 template<class T1,class T2,class T3,class T4,class T5,class T6> inline void
     92     OT(T1 a,T2 b,T3 c,T4 d,T5 e,T6 f) {PT(a),PT(' '),PT(b),PT(' '),PT(c),PT(' '),PT(d),PT(' '),PT(e),PT(' '),PT(f);}
     93 template<class T1,class T2,class T3,class T4,class T5,class T6,class T7> inline void
     94     OT(T1 a,T2 b,T3 c,T4 d,T5 e,T6 f,T7 g) {PT(a),PT(' '),PT(b),PT(' '),PT(c),PT(' '),PT(d),PT(' '),PT(e),PT(' '),PT(f),PT(' '),PT(g);}
     95 
     96 inline void PL(int    a) {printf("%d\n",a);}
     97 inline void PL(char   a) {printf("%c\n",a);}
     98 inline void PL(double a) {printf("%f\n",a);}
     99 inline void PL(LONG   a) {printf("%I64d\n",a);}
    100 inline void PL(string a) {printf("%s\n",a.begin());}
    101 
    102 template<class T1> inline void
    103     OL(T1 a) {PL(a);}
    104 template<class T1,class T2> inline void
    105     OL(T1 a,T2 b) {PT(a),PT(' '),PL(b);}
    106 template<class T1,class T2,class T3> inline void
    107     OL(T1 a,T2 b,T3 c) {PT(a),PT(' '),PT(b),PT(' '),PL(c);}
    108 template<class T1,class T2,class T3,class T4> inline void
    109     OL(T1 a,T2 b,T3 c,T4 d) {PT(a),PT(' '),PT(b),PT(' '),PT(c),PT(' '),PL(d);}
    110 template<class T1,class T2,class T3,class T4,class T5> inline void
    111     OL(T1 a,T2 b,T3 c,T4 d,T5 e) {PT(a),PT(' '),PT(b),PT(' '),PT(c),PT(' '),PT(d),PT(' '),PL(e);}
    112 template<class T1,class T2,class T3,class T4,class T5,class T6> inline void
    113     OL(T1 a,T2 b,T3 c,T4 d,T5 e,T6 f) {PT(a),PT(' '),PT(b),PT(' '),PT(c),PT(' '),PT(d),PT(' '),PT(e),PT(' '),PL(f);}
    114 template<class T1,class T2,class T3,class T4,class T5,class T6,class T7> inline void
    115     OL(T1 a,T2 b,T3 c,T4 d,T5 e,T6 f,T7 g) {PT(a),PT(' '),PT(b),PT(' '),PT(c),PT(' '),PT(d),PT(' '),PT(e),PT(' '),PT(f),PT(' '),PL(g);}
    116 
    117 #endif // __IO__
    118 
    119 #ifndef __MACRO__
    120 #define __MACRO__
    121 
    122 #define ML(times) int tcase; IN(tcase); FOR(times,1,tcase)
    123 
    124 #define FOR(i,a,b) for(int i=int(a),_##i=int(b);i<=_##i;i++)
    125 #define DWN(i,b,a) for(int i=int(b),_##i=int(a);_##i<=i;i--)
    126 #define ECH(i,u,pre,next) for(int i=int(pre[u]);i!=-1;i=int(next[i]))
    127 
    128 #define MEM(a,v) memset(a,v,sizeof(a))
    129 #define CLR(a,v) FOR(_i##a,0,sizeof(a)/sizeof(a[0])-1) a[_i##a]=v
    130 
    131 #define LOOP(a,n)                                               \
    132     FOR(_i##a,0,(n)-1)                                          \
    133         cout<<a[_i##a]<<(_i##a!=n-1?' ':'\n')
    134 #define LOOP2(a,n,m)                                            \
    135     FOR(_i##a,0,(n)-1) FOR(_j##a,0,(m)-1)                       \
    136         cout<<a[_i##a][_j##a]<<(_j##a!=m-1?' ':'\n')
    137 #define LOOPG(G,n,pre,next)                                     \
    138     FOR(_i##a,0,(n)-1) ECH(_j##a,_i##a,pre,next)                \
    139         cout<<_i##a<<" "<<G[_j##a].v<<" "<<G[_j##a].w<<endl
    140 
    141 #endif // __MACRO__
    142 
    143 #ifndef __BIT__
    144 #define __BIT__
    145 
    146 template<class T> inline T lb(T i) {return i&-i;}
    147 template<class T> inline T lc(T i) {return i<<T(1);}
    148 template<class T> inline T rc(T i) {return i<<T(1)|T(1);}
    149 template<class T> inline T at(T a,int i) {return a& (T(1)<<i);}
    150 template<class T> inline T nt(T a,int i) {return a^ (T(1)<<i);}
    151 template<class T> inline T s1(T a,int i) {return a| (T(1)<<i);}
    152 template<class T> inline T s0(T a,int i) {return a&~(T(1)<<i);}
    153 
    154 #endif // __BIT__
    155 
    156 #ifndef __DOUBLE__
    157 #define __DOUBLE__
    158 
    159 const double eps = 1e-8;
    160 
    161 inline int cmp(double a) {return fabs(a-0)<eps?0:((a-0)>eps?+1:-1);}
    162 inline int cmp(double a,double b) {return fabs(a-b)<eps?0:((a-b)>eps?+1:-1);}
    163 
    164 inline double fmax(double a,double b) {return cmp(a,b)>0?a:b;}
    165 inline double fmin(double a,double b) {return cmp(a,b)<0?a:b;}
    166 
    167 #endif // __DOUBLE__
    168 
    169 const int MAXV = 12000;
    170 const int MAXE = 24000;
    171 
    172 struct node
    173 {
    174     int v,w;
    175 }G[MAXE];
    176 int _index,pre[MAXV],next[MAXE];
    177 
    178 void clear(void)
    179 {
    180     _index=0;
    181     MEM(pre,-1);
    182 }
    183 void add(int u,int v,int w)
    184 {
    185     G[_index].v=v;
    186     G[_index].w=w;
    187     next[_index]=pre[u];
    188     pre[u]=_index++;
    189 }
    190 
    191 class HEAP
    192 {
    193 private:
    194     int use,val[MAXV],lab[MAXV],heap[MAXV];
    195 
    196     int sel(int i,int j)
    197     {
    198         return val[heap[i]]<val[heap[j]]?i:j;
    199     }
    200     void change(int i,int j)
    201     {
    202         swap(heap[i],heap[j]);
    203         swap(lab[heap[i]],lab[heap[j]]);
    204     }
    205 public:
    206     int operator [] (int i)
    207     {
    208         return val[i];
    209     }
    210 
    211     bool empty(void)
    212     {
    213         return use==0;
    214     }
    215 
    216     void clear(void)
    217     {
    218         use=0;
    219         MEM(val,inf);
    220         MEM(lab,inf);
    221     }
    222 
    223     void update(int u,int w)
    224     {
    225         if(val[u]>w)
    226         {
    227             val[u]=w;
    228             if(lab[u]==inf) heap[lab[u]=++use]=u;
    229 
    230             for(int i=lab[u];i/2>=1;i=i/2)
    231             {
    232                 if(sel(i,i/2)==i/2) break;
    233                 else change(i,i/2);
    234             }
    235         }
    236     }
    237 
    238     int peek(void)
    239     {
    240         change(1,use);
    241         lab[heap[use--]]=inf;
    242 
    243         for(int i=1;lc(i)<=use;)
    244         {
    245             if(lc(i)==use)
    246             {
    247                 if(sel(i,lc(i))==i) break;
    248                 else i=lc(i);
    249             }
    250             else
    251             {
    252                 if(sel(i,sel(lc(i),rc(i)))==i) break;
    253                 else i=sel(i,sel(lc(i),rc(i)));
    254             }
    255             change(i,i/2);
    256         }
    257         return heap[use+1];
    258     }
    259 }dis;
    260 
    261 int SPFA(int src,int des)
    262 {
    263     dis.clear();
    264     dis.update(src,0);
    265 
    266     while(!dis.empty())
    267     {
    268         int u=dis.peek();
    269         for(int i=pre[u];i!=-1;i=next[i])
    270         {
    271             dis.update(G[i].v,dis[u]+G[i].w);
    272         }
    273     }
    274 
    275     return dis[des];
    276 }
    277 
    278 int n,m,u,v,w;
    279 
    280 int main()
    281 {
    282     while(cin>>n>>m)
    283     {
    284         clear();
    285         while(m--)
    286         {
    287             cin>>u>>v>>w;
    288             add(u,v,w);
    289         }
    290         cin>>u>>v;
    291         cout<<SPFA(u,v)<<endl;
    292     }
    293     return 0;
    294 }

    好腻害……

  • 相关阅读:
    eclipse基础环境配置和svn、maven的配置以及maven的安装
    KindEditor 上传图片浏览器兼容性问题
    FastDFS 工具类实现文件上传_02
    FastDFS 实现图片上传_01
    jvm 堆、栈 、方法区概念和联系
    jvm 虚拟机的组成部分
    利用jQuery实现CheckBox全选/全不选/反选
    FastDFS架构
    Nginx 实现负载均衡
    Nginx 实现反向代理
  • 原文地址:https://www.cnblogs.com/liuxueyang/p/3005876.html
Copyright © 2020-2023  润新知