最短路——小木乃伊到我家(dijkstra)

tech2023-06-30  92

题目链接

最短路——小木乃伊到我家(dijkstra)

题目描述

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”(不用输出双引号)。

示例

输入

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

输出

5

#include<bits/stdc++.h> #define pii pair<int,int> using namespace std; const int inf=0x3f3f3f3f; const int maxn=200005; struct node{ int to,s; }; vector<node> f[maxn]; int dis[maxn],vis[maxn]; int n,m,u,v,w; void dijkstra(int t) { priority_queue<pii,vector<pii>,greater<pii> > q; dis[t]=0; q.push(pii(0,t)); while(!q.empty()){ pii x=q.top(); q.pop(); int tt=x.second; if(vis[tt]){ continue; } vis[tt]=1; for(int i=0;i<f[tt].size();i++){ node a=f[tt][i]; if(dis[a.to]>dis[tt]+a.s){ dis[a.to]=dis[tt]+a.s; q.push(pii(dis[a.to],a.to)); } } } } int main() { cin>>n>>m; for(int i=1;i<=n;i++){ dis[i]=inf; } memset(vis,0,sizeof(vis)); for(int i=1;i<=m;i++){ cin>>u>>v>>w; f[u].push_back({v,w}); f[v].push_back({u,w}); } dijkstra(1); if(dis[n]==inf){ cout<<"qwb baka"<<endl; } else{ cout<<dis[n]<<endl; } return 0; }
最新回复(0)