SPFA+优先队列维护

版权声明:转就转吧~~记得声明噢~~ https://blog.csdn.net/Soul_97/article/details/79949872
链接: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”(不用输出双引号)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 200005;
const int inf = 0x3f3f3f3f;
struct node{
	int end;
	int weight;
	node(int e,int w)
	{
		this->end = e;
		this->weight = w;
	}
}; 
int n, m;
ll dis[maxn];
vector<node> edge[maxn];

void spfa()
{
	fill(dis, dis + maxn, inf);
	priority_queue<int, vector<int>, greater<int> > q;
	q.push(1);
	dis[1] = 0;
	while(!q.empty())
	{
		int tmp = q.top();
		q.pop();
		for(int i = 0;i < edge[tmp].size();i ++)
		{
			int nowEnd = edge[tmp][i].end;
			int nowWeight = edge[tmp][i].weight;
			if(dis[nowEnd] > dis[tmp] + nowWeight)
			{
				dis[nowEnd] = dis[tmp] + nowWeight;
				q.push(nowEnd);
			}
		}
	}
}
int main()
{    
	int t1, t2, t3;
	cin >> n >> m;
	for(int i = 1;i <= m;i ++)
	{
		scanf("%d%d%d",&t1,&t2,&t3);
		edge[t1].push_back(node(t2,t3));
		edge[t2].push_back(node(t1,t3));
	}
	
	spfa();
	
	if(dis[n] != inf)
	cout << dis[n] << endl;
	else
	cout << "qwb baka" << endl;
	return 0; 
}


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页