• [洛谷3371]【模板】单源最短路径


    思路:Dijkstra+堆优化

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<vector>
     4 #include<ext/pb_ds/priority_queue.hpp>
     5 #define dis first
     6 #define to second
     7 #define Edge std::pair<int,int>
     8 #define inf 0x7fffffff
     9 #define M 500001
    10 #define N 10001
    11 int n,m,s;
    12 int d[N];
    13 struct Graph {
    14     std::vector<Edge> e[M];
    15     void add(int f,int g,int w) {
    16         e[f].push_back((Edge){w,g});
    17     }
    18 };
    19 Graph g;
    20 inline void dijkstra() {
    21     __gnu_pbds::priority_queue<Edge,std::greater<Edge> > q;
    22     __gnu_pbds::priority_queue<Edge,std::greater<Edge> >::point_iterator a[n+1];
    23     for(int i=1;i<=n;i++) if(i!=s) a[i]=q.push((Edge){d[i]=inf,i});
    24     a[s]=q.push((Edge){d[s]=0,s});
    25     while(!q.empty()) {
    26         Edge x=q.top();
    27         q.pop();
    28         if(x.dis==inf) continue;
    29         int u=x.to;
    30         for(std::vector<Edge>::iterator i=g.e[u].begin();i<g.e[u].end();i++) {
    31             Edge& e=*i;
    32             if(d[u]+e.dis<d[e.to]) {
    33                 d[e.to]=d[u]+e.dis;
    34                 q.modify(a[e.to],(Edge){d[e.to],e.to});
    35             }
    36         }
    37     }
    38 }
    39 int main() {
    40     scanf("%d%d%d",&n,&m,&s);
    41     for(int i=1;i<=m;i++) {
    42         int a,b,w;
    43         scanf("%d%d%d",&a,&b,&w);
    44         if(a==b) continue;
    45         g.add(a,b,w);
    46     }
    47     dijkstra();
    48     for(int i=1;i<=n;i++) {
    49         printf("%d ",d[i]);
    50     }
    51     printf("
    ");
    52     return 0;
    53 }
  • 相关阅读:
    linux权限掩码
    主机跨网通信时的字节序转换
    鸽巢原理-poj3370
    鸽巢原理
    JS面向对象关键词
    Less 命令技巧,从底部网上看
    软件工程概论第七章
    软件工程概论第八章
    软件工程概论第六章
    软件工程概论第五章
  • 原文地址:https://www.cnblogs.com/skylee03/p/6898410.html
Copyright © 2020-2023  润新知