来源

https://vijos.org/p/1767

  • 描述
    Hwz把YYB放到了一个迷宫之中,这个迷宫由n个节点构成,两个节点之间可能存在多条无向边,YYB的起点为1号节点,终点为n号节点。有m条无向边,对于每一条无向边,存在一个喋血值(∈N*,且≤100),即走过这条边的花费。另外,还有k个节点上有治疗药,即若YYB走到这个节点上时(不妨称这个点为治愈点),他身上所累积的喋血值会归零。YYB希望以最小的喋血值走完迷宫。

  • 格式
    输入格式
    第1行n,m,k分别表示有n个节点,m条无向边,以及k个治愈点。
    第2行到m+1行 每一行有一个x,y,z表示x到y有一条喋血值为z的无向边。
    第n+2行 有k个整数,分别为治愈点的号数。
    PS:保证数据中没有负权回路。保证治愈点不重复。
    输出格式
    一行minblood 表示YYB走完迷宫的最小喋血值
    当然,如果无法走出迷宫,输出Oh no!

  • 样例
    样例输入
    3 3 1
    1 2 100
    2 3 1
    1 3 3
    2
    样例输出
    1

  • 范围
    对于100%的数据
    1≤n≤5000,1≤k≤n,1≤m≤250001≤n≤5000,1≤k≤n,1≤m≤25000

  • 题解
    首先要发现答案肯定是从起点或者某个治愈点到达终点的最短路的权值。
    那就先把起点看成一个治愈点,反正一开始在起点处喋血值为0,YYB也不会无脑到从起点转上一圈再往终点走。
    然后在终点开始跑一遍单源最短路,枚举所有治愈点(算上起点),取最小的就可以了。
    题目没说有无负权边,所以写了个spfa。

  • Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int maxm = 5005, maxn = 50010, nil = 0, oo = 1000000000;
int n, m, k, s[maxm];
int e, pnt[maxm], u[maxn], v[maxn], w[maxn], nxt[maxn];
int d[maxm];
bool vis[maxm];
void add(int a, int b, int c)
{u[++e] = a; v[e] = b; w[e] = c;nxt[e] = pnt[a]; pnt[a] = e;
}
void init()
{int a, b, c;scanf("%d%d%d", &n, &m, &k);s[0] = 1;for(int i = 1; i <= m; ++i){scanf("%d%d%d", &a, &b, &c);add(a, b, c); add(b, a, c);}for(int i = 1; i <= k; ++i){scanf("%d", &s[i]);}
}
void work()
{memset(d, 0x3f, sizeof(d));memset(vis, 0, sizeof(vis));queue <int> Q;d[n] = 0;vis[n] = true;Q.push(n);while(!Q.empty()){int t = Q.front();Q.pop();for(int j = pnt[t]; j != nil; j = nxt[j]){if(d[v[j]] > d[t] + w[j]){d[v[j]] = d[t] + w[j];if(!vis[v[j]]){vis[v[j]] = true;Q.push(v[j]);}}}}if(d[1] > oo){puts("Oh no!");return;}int ans = oo;for(int i = 0; i <= k; ++i){ans = min(ans, d[s[i]]);}printf("%d\n", ans);
}
int main()
{init();work();return 0;
}

Vijos1767YYB喋血题解相关推荐

  1. Vijos1767-YYB喋血

    描述 Hwz把YYB放到了一个迷宫之中,这个迷宫由n个节点构成,两个节点之间可能存在多条无向边,YYB的起点为1号节点,终点为n号节点.有m条无向边,对于每一条无向边,存在一个喋血值(∈N*,且≤10 ...

  2. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  3. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  4. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  5. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  6. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  7. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  8. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  9. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

最新文章

  1. 不小心关闭了explorer.exe进程,桌面变白解决办法
  2. 排序算法之——插入排序
  3. 【LeetCode】整数反转
  4. 实战_23_高可用负载均衡集群的实现(Mycat+ZK +HAProxy + Keepalived)
  5. Nmap个人实战总结
  6. 论文笔记-深度估计(4) Semi-Supervised Deep Learning for Monocular Depth Map Prediction
  7. Python项目如何打包成whl文件
  8. c语言if的作用,c语言if语句的用法
  9. 如何用EasyRecovery恢复U盘内损坏的数据
  10. 泰康人寿java开发待遇怎么样_宋晓伟-泰康人寿-5年Java开发高级工程师-猿急送
  11. 前端实现下拉显示更多功能
  12. Hack The Box - Meta 利用Exiftool远程代码执行漏洞获取webshell,ImageMagrick命令执行漏洞横向提权,更改环境配置SUDO纵向提权
  13. textarea在IE浏览器下只显示一行
  14. 我的CentOS 7 U盘安装之路 (Win 8.1 Profession + CentOS 7双系统)
  15. To B 业务 vs To C 业务
  16. 第一次用示波器怎么使用(基础经验)
  17. 经过前面几天的学习已经初步了解到了Java 今天开始学习Java的 对象与类
  18. 《Android 应用 之路》 聚合数据SDK
  19. yarn 编译环境时遇到的问题和解决方法
  20. 360断网工具箱简单分析

热门文章

  1. spring mvc 3支持 http 的put和delete方法
  2. 【UWP通用应用开发】文件选取器、获取文件属性、写入和读取、保存读取和删除应用数据
  3. 支付宝支付(2)之公钥证书方式
  4. 基于WSP/WTP的MMS传输(5)——WSP 协议的实现
  5. Word 2003 视频教程-Word 保存文件(转)
  6. 记Java如何获取MAC地址
  7. Valgrind 基本用法
  8. 安装驱动的inf文件资料,通过inf文件改变硬盘外观
  9. Ubuntu系统不显示WiFi,已解决
  10. 网络教育计算机统考成绩,2021年网络教育统考成绩查询入口