• 2018年长沙理工大学第十三届程序设计竞赛 E小木乃伊到我家(spfa模版)


    链接:https://www.nowcoder.com/acm/contest/96/E
    来源:牛客网

    小木乃伊到我家
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

      AA的欧尼酱qwb是个考古学家,有一天qwb发现了只白白圆圆小小的木乃伊,它是个爱哭鬼却很努力。qwb想把这么可爱的小木乃伊送给
    AA,于是便找上了快递姐姐,这下可让快递姐姐犯愁了,因为去往AA家的路实在太难走了(甚至有可能没有路能走到AA家),快递姐姐
    找上聪明的ACMer,想请你帮忙找出最快到达AA家的路,你行吗?

    输入描述:

    第一行输入两个整数n和m(2<=n<=m<=200000),分别表示有n座城市和m条路,城市编号为1~n(快递姐姐所在城市为1,AA所在城市为n)。
    接下来m行,每行输入3个整数u,v,w(u,v<=n,w<=100000),分别表示城市u和城市v之间有一条长为w的路。

    输出描述:

    输出结果占一行,输出快递姐姐到达AA家最短需要走多远的路,如果没有路能走到AA家,则输出“qwb baka”(不用输出双引号)。
    示例1

    输入

    4 4
    1 2 1
    2 3 2
    3 4 3
    2 3 1

    输出

    5

     1 #include<cstdio>
     2 #include<string.h>
     3 #include<algorithm>
     4 #include<queue>
     5 using namespace std;
     6 #define ll long long
     7 const int maxn=200005;
     8 ll head[maxn*2],d[maxn],tol=0,n,m;
     9 bool is[maxn];
    10 queue<long long>P;
    11 struct node
    12 {
    13     ll to,next,cost;
    14 }rode[maxn*2];
    15 void add(ll a,ll b,ll c)
    16 {
    17     rode[tol].to=b;
    18     rode[tol].cost=c;
    19     rode[tol].next=head[a];
    20     head[a]=tol++;
    21 }
    22 void spfa()
    23 {
    24     for(int i=0;i<maxn;i++)d[i]=1e18;
    25     d[1]=0;is[1]=1;P.push(1);
    26     while(!P.empty())
    27     {
    28         ll v=P.front();P.pop();
    29         is[v]=0;
    30         for(ll i=head[v];i!=-1;i=rode[i].next)
    31         {
    32             node e=rode[i];
    33             if(d[e.to]>d[v]+e.cost)
    34             {
    35                 d[e.to]=d[v]+e.cost;
    36                 if(!is[e.to])
    37                 {
    38                     is[e.to]=1;
    39                     P.push(e.to);
    40                 }
    41             }
    42         }
    43     }
    44 }
    45 int main()
    46 {
    47     scanf("%lld%lld",&n,&m);
    48     memset(head,-1,sizeof(head));
    49     for(int i=0;i<m;i++)
    50     {
    51         ll x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
    52         add(x,y,z);
    53         add(y,x,z);
    54     }
    55     spfa();
    56     if(d[n]<1e18/2)printf("%lld
    ",d[n]);
    57     else printf("qwb baka
    ");
    58     return 0;
    59 }
  • 相关阅读:
    UVA10763交换学生
    UVA10763交换学生
    UVA10391复合词
    UVA10391复合词
    UVA10125和集
    UVA10125和集
    POJ3762 时间段用k次
    POJ3762 时间段用k次
    Win64 驱动内核编程-11.回调监控进线程句柄操作
    Win64 驱动内核编程-11.回调监控进线程句柄操作
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13271064.html
Copyright © 2020-2023  润新知