单源最短路(手写堆+位运算优化+卡常+O2 = Luogu排名最后一页...)

如题

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<queue>
  5 #define rep(i,a,n) for(register int i = a;i <= n;++i)
  6 using namespace std;
  7 
  8 void read(int& a){
  9     a = 0;char c = getchar();
 10     while(c < '0'||c > '9')c = getchar();
 11     while('0' <= c&&c <= '9')a = a*10+c-'0',c = getchar();
 12 }
 13 
 14 const int Maxn = 1e5+10,Maxm = 2e5+10; 
 15 
 16 template<typename T>
 17 
 18 void iswap(T &a,T &b){
 19     T t = a;
 20     a = b;
 21     b = t;
 22 }
 23 
 24 template<typename T>
 25 struct Heap{
 26     T a[1000010];int n;
 27     Heap():n(0){}
 28     int size(){return n;}
 29     bool empty(){return !n;}
 30     T top(){return a[1];}
 31     void clear(){n = 0;}
 32     
 33     void push(T x){
 34         a[++n] = x;
 35         int cur = n;
 36         while((cur>>1)&&a[cur>>1] < a[cur])
 37             iswap(a[cur>>1],a[cur]),cur >>= 1;
 38     }
 39     
 40     void pop(){
 41         iswap(a[1],a[n--]);
 42         int cur = 1;
 43         while((cur<<1|1) <= n)
 44             if(a[cur<<1] < a[cur<<1|1]){
 45                 if(a[cur] < a[cur<<1|1]){
 46                     iswap(a[cur],a[cur<<1|1]);
 47                     cur = cur<<1|1;
 48                 }
 49                 else break;
 50             }
 51             else{
 52                 if(a[cur] < a[cur<<1]){
 53                     iswap(a[cur],a[cur<<1]);
 54                     cur <<= 1; 
 55                 } 
 56                 else break;
 57             }
 58         if((cur<<1) <= n&&a[cur] < a[cur<<1])
 59             iswap(a[cur],a[cur<<1]);
 60     }
 61 };
 62 
 63 struct Edge{
 64     int to,wi,ne;
 65 }edges[Maxm];
 66 
 67 int first[Maxn],d[Maxn],vis[Maxn];
 68 int n,m,s,cnte,x,y,z;
 69 
 70 inline void add_edge(int fr,int to,int wi){
 71     edges[++cnte] = (Edge){to,wi,first[fr]};
 72     first[fr] = cnte;
 73 }
 74 
 75 struct Node{
 76     int to,d;
 77     bool operator <(const Node x)const{
 78         return d > x.d;
 79     }
 80 };
 81 
 82 Heap<Node> q;
 83 
 84 inline void dijkstra(int s){
 85     memset(d,0x3f,sizeof(d));
 86     d[s] = 0; q.clear();
 87     q.push((Node){s,0});
 88     while(!q.empty()){
 89         int u = q.top().to; q.pop();
 90         if(vis[u])continue; vis[u] = 1;
 91         for(register int i = first[u];i;i = edges[i].ne){
 92             if(d[edges[i].to] > d[u]+edges[i].wi){
 93                 d[edges[i].to] = d[u]+edges[i].wi;
 94                 q.push((Node){edges[i].to,d[edges[i].to]});
 95             }
 96         }
 97     }
 98 }
 99 
100 int main(){
101     read(n),read(m),read(s);
102     rep(i,1,m){
103         read(x),read(y),read(z);
104         add_edge(x,y,z);
105     }
106     dijkstra(s);
107     rep(i,1,n)printf("%d ",d[i]);
108 return 0;
109 }

 

上一篇:P3254 圆桌问题(最大流板子,求二分图多重最大匹配的值)


下一篇:P4014 分配问题 网络流