SPFA+优先队列维护

标签: c c++ spfa
11人阅读 评论(0) 收藏 举报
分类:
链接: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; 
}


查看评论

HDU 1512 Monkey King(左偏树+并查集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1512 题       意: 有n个猴子,一开始每个猴子只认识自己。每个猴子有一个力量值,力量值越大表...
  • Seraphimon
  • Seraphimon
  • 2015年07月27日 19:05
  • 395

The kth great number-优先队列的k维护

http://acm.hdu.edu.cn/showproblem.php?pid=4006 题意:题目会给出n个数,求第k大的数. 输入:第一行输入两个整数n 和 k ...
  • viphong
  • viphong
  • 2015年08月07日 23:34
  • 447

左偏树(Leftist Tree)的合并

[左偏树的合并] 左偏树的一切操作都是在合并的基础上进行的,所以要先讨论合并。 当合并两个左偏树节点a,b时,要求是这两个节点是没有包含关系的。假设a.key 可以证明,一次合并的时...
  • u013748084
  • u013748084
  • 2014年12月16日 11:50
  • 250

hdu 4261 Estimation (优先队列预处理+DP)

Estimation Time Limit: 40000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others...
  • u010228612
  • u010228612
  • 2014年03月27日 22:18
  • 1072

优先队列的数组实现(有序)

优先队列上文介绍了一种方法,另一种方法就是在insert()方法中添加代码,将所有较大的元素向右边一定一格以使数组保持有序(和插入排序一样)。这样,最大的元素总会在数组的一边,优先队列的删除最大元素操...
  • heifan2014
  • heifan2014
  • 2016年10月10日 20:04
  • 1275

POJ-3635-Full Tank?-spfa+ 优先队列

一开始想用DP做的,后来想了想,用DP的肯定会超时。 然后想用dij跑图就可以了,然后再加上优先队列优化。 没到达一个点的时候,有两种选择,一种是一点油都不加,然后往后跑。 另外一种就是加一升的...
  • rowanhaoa
  • rowanhaoa
  • 2014年04月06日 22:20
  • 1054

POJ1722二维spfa+优先队列优化

题意:      给你一个有向图,然后求从起点到终点的最短,但是还有一个限制,就是总花费不能超过k,也就是说每条边上有两个权值,一个是长度,一个是花费,求满足花费的最短长度。 思路:  ...
  • u013761036
  • u013761036
  • 2015年02月06日 16:44
  • 542

poj 1724~ROADS(spfa+优先队列)

ROADSTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 14776 Accepted: 5352DescriptionN citi...
  • m0_37134257
  • m0_37134257
  • 2017年04月13日 20:46
  • 144

用邻接表实现spfa

1         2         3
  • u014007510
  • u014007510
  • 2014年05月07日 21:12
  • 812

[模板]spfa+邻接表

就是用了前向星来储存这个图 进行spfa时可以少进行很多次判断type arr=record x,y,w,next:longint; end; var edge:...
  • Nidhogg__
  • Nidhogg__
  • 2016年08月19日 11:53
  • 551
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 2546
    排名: 1万+
    文章存档
    最新评论