zoukankan      html  css  js  c++  java
  • 模板:单源最短路径。堆优化的dijkstra。

    首先是用结构体的

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 using namespace std;
     6 const int maxn=200010;
     7 int cnt=0, n, m, s;
     8 int d[maxn], h[maxn];
     9 struct edge{
    10     int to, next, v;
    11 }e[maxn*2];
    12 struct node{
    13     int val, v;
    14     bool operator <(const node &b) const{
    15         return val>b.val;
    16     }
    17 };
    18 priority_queue<node>q;
    19 void add(int x, int y, int w){
    20     e[++cnt].to=y;
    21     e[cnt].v=w;
    22     e[cnt].next=h[x];
    23     h[x]=cnt;
    24 }
    25 void dijkstra(){
    26     memset(d,0x3f,sizeof(d));
    27     d[s]=0;
    28     node xx;
    29     xx.val=0;
    30     xx.v=s;
    31     q.push(xx);
    32     while(!q.empty()){
    33         int x=q.top().v;
    34         int dd=q.top().val;
    35         q.pop();
    36         if(dd!=d[x]) continue;
    37         for(int i=h[x]; i; i=e[i].next){
    38             int y=e[i].to, z=e[i].v;
    39             if(d[y]>d[x]+z){
    40                 d[y]=d[x]+z;
    41                 node p;
    42                 p.val=d[y];
    43                 p.v=y;
    44                 q.push(p);
    45             }
    46         }
    47     }
    48 }
    49 int main(){
    50     scanf("%d%d%d",&n,&m,&s);
    51     for(int i=1; i<=m; i++){
    52         int a, b, c;
    53         scanf("%d%d%d",&a,&b,&c);
    54         add(a, b, c);
    55     }
    56     dijkstra();
    57     for(int i=1; i<=n; i++){
    58         printf("%d ", d[i]);
    59     }
    60     return 0;
    61 }

    然后是使用stl的

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int maxn=200010;
    int cnt=0, n, m, s;
    int to[maxn], h[maxn], next[maxn], v[maxn];
    int d[maxn], qwq[maxn];
    priority_queue<pair<int, int> >q;
    void add(int x, int y, int w){
        to[++cnt]=y;
        v[cnt]=w;
        next[cnt]=h[x];
        h[x]=cnt;
    }
    void dijkstra(){
        memset(d,0x3f,sizeof(d));
        memset(qwq, 0, sizeof(qwq));
        d[s]=0;
        q.push(make_pair(0,s));
        while(q.size()){
            int x=q.top().second;
            q.pop();
            if(qwq[x]) continue;
            qwq[x]=1;
            for(int i=h[x]; i; i=next[i]){
                int y=to[i], z=v[i];
                if(d[y]>d[x]+z){
                    d[y]=d[x]+z;
                    q.push(make_pair(-d[y],y));
                }
            }
        }
    }
    int main(){
        scanf("%d%d%d",&n,&m,&s);
        for(int i=1; i<=m; i++){
            int a, b, c;
            scanf("%d%d%d",&a,&b,&c);
            add(a, b, c);
        }
        dijkstra();
        for(int i=1; i<=n; i++){
            printf("%d ", d[i]);
        }
        return 0;
    }

    基本上两种写法时间差距并不是很大,qwq所以怎么舒服怎么来

  • 相关阅读:
    常用的居中方法
    CSS实现盒子高度撑开且以最高的为高
    利用vertical-align实现行内元素对齐
    CSS实现模糊效果
    【LeetCode 37】解数独
    【LeetCode 36】有效的数独
    【LeetCode 35】搜索插入位置
    【LeetCode 34】在排序数组中查找元素的第一个和最后一个位置
    【LeetCode 33】搜索旋转排序数组
    【LeetCode 32】最长有效括号
  • 原文地址:https://www.cnblogs.com/Aze-qwq/p/9834469.html
Copyright © 2011-2022 走看看