题目描述
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 <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <algorithm> 6 #include <vector> 7 #include <queue> 8 using namespace std; 9 typedef long long ll; 10 typedef pair<ll,ll> P; 11 const int N=2e5+9; 12 const ll inf=1e12+8;//注意范围 13 struct Node 14 { 15 ll to,w; 16 Node(){} 17 Node(ll TO,ll W) 18 { 19 to=TO; 20 w=W; 21 } 22 }; 23 ll dis[N]; 24 vector<Node>vec[N]; 25 void bfs()//数据量较大的单源最短路径。 26 { 27 priority_queue<P,vector<P>,greater<P> >que;//按pair的second排序 28 ll x=0,y=1; 29 que.push(P(x,y)); 30 dis[y]=x; 31 while(!que.empty()) 32 { 33 P q=que.top(); 34 que.pop(); 35 ll v=q.second; 36 if(dis[v]<q.first) continue;//那么,走这条路的距离会大 37 for(int i=0;i<vec[v].size();i++) 38 { 39 Node Nod=vec[v][i]; 40 ll t=Nod.to; 41 if(dis[t]>dis[v]+Nod.w) 42 { 43 dis[t]=dis[v]+Nod.w; 44 que.push(P(dis[t],t)); 45 } 46 } 47 } 48 } 49 int main() 50 { 51 int n,m; 52 ll u,v,w; 53 scanf("%d%d",&n,&m); 54 for(int i=0;i<m;i++) 55 { 56 scanf("%lld%lld%lld",&u,&v,&w); 57 vec[u].push_back(Node(v,w)); 58 vec[v].push_back(Node(u,w)); 59 } 60 for(int i = 1; i <= n; i ++) 61 dis[i] = inf; 62 //memset(dis,inf,sizeof(dis));//memset会出现错误。 63 bfs(); 64 if(dis[n]!=inf) 65 { 66 printf("%lld\n",dis[n]); 67 } 68 else{ 69 printf("qwb baka\n"); 70 } 71 return 0; 72 }
原文地址:https://www.cnblogs.com/tingtin/p/10531005.html
时间: 2024-10-09 03:34:29