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 }
原文地址:https://www.cnblogs.com/caiyishuai/p/8847071.html