小木乃伊到我家 dijkstra + 链表 + 优先队列
https://ac.nowcoder.com/acm/contest/96/E?&headNav=www&headNav=acm
题目描述
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
-->
题解:$a[i] = j$ 代表第 $i$ 条边的起点是 $j$; $b[i] = j$ 代表第 $i$ 条边的终点是 $j$; $c[i] = j$ 代表第 $i$ 条边的长度是 $j$; $nx[i]$ 代表的是第 $i$ 条边的下一条边是 $j$ 边; $h[i] = j$ 代表以 $i$ 开始的边是第 $j$ 边
代码:
#include <bits/stdc++.h>
using namespace std; long long INF = 1e18;
const int Node= 200000 + 10;
const int Edge = (200000 + 10) * 2; int n, m, s;
long long dis[Node];
int h[Node], a[Edge], b[Edge], nx[Edge], edgeCount;
long long c[Edge]; void init() {
s = 1;
edgeCount = 0; for (int i = 1; i <= n; i++) {
dis[i] = INF;
h[i] = -1;
}
dis[s] = 0;
} void add(int aa, int bb, long long cc) {
a[edgeCount] = aa;
b[edgeCount] = bb;
c[edgeCount] = cc; nx[edgeCount] = h[aa];
h[aa] = edgeCount;
edgeCount++;
} void input() {
for (int i = 1; i <= m; i++) {
int aa, bb;
long long cc;
scanf("%d%d%lld", &aa, &bb, &cc);
add(aa, bb, cc);
add(bb, aa, cc);
}
} void dijkstra() {
priority_queue<pair<long long, int>> q;
q.push(make_pair(0, s));
while (!q.empty()) {
pair<long long, int> tp = q.top();
q.pop(); int d = -tp.first;
int v = tp.second; for (int i = h[v]; i != -1; i = nx[i]) {
if (dis[v] + c[i] < dis[b[i]]) {
dis[b[i]] = dis[v] + c[i];
q.push(make_pair(-dis[b[i]], b[i]));
}
}
}
} int main() {
while (~scanf("%d%d", &n, &m)) {
if (n == 0 && m == 0) {
break;
} init();
input();
dijkstra(); if (dis[n] != INF) {
printf("%lld\n", dis[n]);
} else {
printf("qwb baka\n");
}
}
return 0;
}
神仙代码昨天差不多看了半天 脑阔疼 学到了
小木乃伊到我家 dijkstra + 链表 + 优先队列的更多相关文章
- 2018年长沙理工大学第十三届程序设计竞赛 E小木乃伊到我家(spfa模版)
链接:https://www.nowcoder.com/acm/contest/96/E来源:牛客网 小木乃伊到我家 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...
- 2018年长沙理工大学第十三届程序设计竞赛 E 小木乃伊到我家 【最短路】
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 AA的欧尼酱qwb是个考古学家,有一天qwb发 ...
- 一个人的旅行(用小技巧转化为dijkstra算法)
注意: 1:因为两点之间可能有多条路,所以更新路径长度的时候做一次判断 if(time < mat[a][b]) mat[a][b] = mat[b][a] = time; 2:因为主函数中的数 ...
- dijkstra 的优先队列优化
既然要学习算法,就要学习到它的精髓,才能够使用起来得心应手. 我还是远远不够啊. 早就知道,dijkstra 算法可以用优先队列优化,我却一直不知道该怎样优化.当时,我的思路是这样的:假设有n个顶点, ...
- Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解
/* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...
- 51nod 1471 小S的兴趣 | 分块 链表
51nod 1471 小S的兴趣 题面 小S喜欢有趣的事.但是,每个人的兴趣都是独特的.小S热衷于自问自答.有一天,小S想出了一个问题. 有一个包含n个正整数的数组a和针对这个数组的几个问题.这些问题 ...
- 【P2107】小Z的AK计划(优先队列+贪心)
水一发优先队列的水题.. 这个题貌似以前有做过类似的.具体的方法是用大根堆辅助贪心算法得出正解.可以看出来,如果小Z走到了某个地方,那么他最远一定是到了这里,不可能有再走回来这种操作,因为很明显那样不 ...
- 【BZOJ4548】小奇的糖果 set(链表)+树状数组
[BZOJ4548]小奇的糖果 Description 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的 ...
- 2018.10.24 NOIP模拟 小 C 的序列(链表+数论)
传送门 考虑到a[l],gcd(a[l],a[l+1]),gcd(a[l],a[l+1],a[l+2])....gcd(a[l]...a[r])a[l],gcd(a[l],a[l+1]),gcd(a[ ...
随机推荐
- Linux中的/etc/nologin问题
/etc/nologin 文件给系统管理员提供了在 Linux 系统维护期间禁止用户登陆的方式. 如果系统中存在 /etc/nologin 文件那么普通用户登陆就会失败. 这是一种提高安全性和防止数据 ...
- Mybatis异常:java.lang.NumberFormatException: For input string: "S"
MyBatis异常日志如下: Caused by: java.lang.NumberFormatException: For input string: "S" at sun.mi ...
- URL中传递JSON数据
有关于JSON如何在前后之间进行传递,转换成对象等操作,请查看 C#Json数据交互 (这篇文章主要介绍了如何转化Json格式的数据,以及如何使用) 我们在URL中传递数据一般都是 XX.asp ...
- matlab vs联调
vs 和matlab联调,最近真的把我搞挂了要. 首先,怎么进入联调呢.在vs里先设置一下. vs:tools->attach to process,选择matlab,注意此时matlab一定是 ...
- fastjson 应用
fastjson优势就是解析快,用法和json-lib.jar差不多(如下图) 贴心的附上jar和反编译工具:https://pan.baidu.com/s/1iADAiFyoUZVBAFSPsIeY ...
- 关于var和ES6中的let,const的理解
var的作用就不多说了,下面说说var的缺点: 1.var可以重复声明 var a = 1; var a = 5; console.log(a); //5 不会报错 在像这些这些严谨的语言来说,一般是 ...
- poj_2689_Prime Distance
The branch of mathematics called number theory is about properties of numbers. One of the areas that ...
- Java - 关于基础数据类型的形参和返回值
1. 当基础数据类型被当作形参时,最好使用其包装类,因为这样可方便调用者传参(基础数据类型亦或是其包装类都可) 2. 当基础数据类型被当作返回值时,最好使用原型,因为这样可以方便调用者接收返回值( ...
- jquery动态改变元素内容
● text() - 设置或返回所选元素的文本内容 ● html() - 设置或返回所选元素的内容(包括 HTML 标记) ● val() - 设置或返回表单字段的值(只针对表单或者输入框)
- Pythond函数的参数使用操作注意事项
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...