• 洛谷P4779 Dijkstra 模板


    这道题很久之前做过

    今天复习(复读)一遍

    有疑问的就是pair的专属头文件#include<utility>

    但是据说iostream和vector等已经包含了这个

    #include<queue> //据说pair有专门的头文件utility,但是交到洛谷上就变成了queue
    #include<queue>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    priority_queue<pair<int,int> > q; //pair用堆优化(这是一个优先队列从大到小
    struct edge{
    int next,to,dis;
    };
    edge e[200800];
    int head[1000010];
    int d[100800],vis[100800];
    int s;
    int size,n,m;
    void addedge(int next,int to,int dis) //链表加边 如果不清楚的话墙裂安利自己手动模拟运算一下
    //或者用Excel手算,新手不明白的原因是这种做法是把先加的边放在最底下,head[点]以及next[点]存的是该点的数组下标
    //而to存的是这个点
    {
    e[++size].next=head[next];
    e[size].to=to;
    e[size].dis=dis;
    head[next]=size;
    }
    void dij(int start)
    {
    memset(d,0x3f,sizeof(d));
    memset(vis,0,sizeof(vis));
    d[start]=0; //我 到 我自己 没有距离
    q.push(make_pair(0,start));
    while(!q.empty())
    {
    int t=q.top().second;
    q.pop();
    if(vis[t]) continue; //dij的宗旨是每个点访问一次
    vis[t]=1;
    for(int i=head[t];i;i=e[i].next)
    {
    int y=e[i].to;
    int k=e[i].dis;
    if(d[y]>d[t]+k) //如果一个路线比你短,还比你经过的点多(划去)
    {
    d[y]=d[t]+k;
    q.push(make_pair(-d[y],y)); //例如3比5小,但是-3比-5大
    }
    }
    }
    }
    int main()
    {

    cin>>n>>m>>s;
    for(int i=1;i<=m;i++)
    {
    int tx,ty,tdis;
    scanf("%d %d %d",&tx,&ty,&tdis);
    addedge(tx,ty,tdis);
    }
    dij(s);
    for(int i=1;i<=n;i++)
    printf("%d ",d[i]);
    return 0;
    }

    赋初值用 63是用二进制赋值变成2^6-1(占7个)至于不是127是因为第一个int数组里面存的是正负如果用127可能弄出负值

  • 相关阅读:
    计蒜客模拟赛D2T2 蒜头君的排序:区间逆序对(移动端点) + 树状数组
    计蒜客模拟赛D2T1 蒜头君的兔子:矩阵快速幂
    计蒜客模拟赛D1T2 蒜头君的树:树上节点之间最短距离和
    计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和
    Cubieboard安装系统
    awk速查手册
    sed速查手册
    常用正则表达
    MySQL索引小记
    jQuery中attr和prop的区别
  • 原文地址:https://www.cnblogs.com/zsx6/p/11052948.html
Copyright © 2020-2023  润新知