luogu P4943 密室 |最短路
题目描述
密室被打开了。###
哈利与罗恩进入了密室,他们发现密室由n个小室组成,所有小室编号分别为:1,2,...,n。所有小室之间有m条通道,对任意两个不同小室最多只有一条通道连接,而每通过一条通道都需要Ci 的时间。
开始时哈利与罗恩都在编号为1的小室里,他们的目标是拯救金妮和寻找日记,但是他们发现金妮和日记可能在两个不同的小室里,为了尽快发现真相,他们决定以最少的时间到达两个目标小室。但是某些小室只有会与蛇对话的人才能进入,也就是只有哈利一个人可以进入。
现在,哈利告诉你密室的结构,请你计算他们到达两个目标小室的最短时间。
输入格式
第一行 n,m,k 表示有n个小室m条通道,k间小室只有哈利可以进入。
第二行 k 个数,表示只有哈利可以进入的小室的编号。(若k=0,不包含该行)
接下来m行,每行3个数:a,b,c 表示a小室与b小室之间有一条需要花费c时间的通道。
最后一行,两个数 x,y 表示哈利与罗恩需要去的小室的编号
输出格式
一行,输出一个数,表示到达两个密室的最短时间。
#include<bits/stdc++.h>
#define N 1000005
#define M 100005
#define QAQ 2147483647
using namespace std;
inline int read() {//快读
int f=1,x=0;
char ch;
do {
ch=getchar();
if(ch=='-')f=-1;
} while(ch<'0'||ch>'9');
do {
x=x*10+ch-'0';
ch=getchar();
} while(ch>='0'&&ch<='9');
return f*x;
}
struct eat{
int next,to,quan;
}a[N];
int head[M],cnt;
int n,m,k;
int d1[M],d2[M],d3[M];
inline void add(int x,int y,int z){//链式前向星
a[++cnt].next=head[x];
a[cnt].to=y;
a[cnt].quan=z;
head[x]=cnt;
}
struct node{
int u,d;
bool operator <(const node& rhs)const{
return d>rhs.d;
}
};
bool f[M];
void dj1(int s){
for(int i=1;i<=n;i++)d1[i]=QAQ;
d1[s]=0;
priority_queue<node>Q;
Q.push((node){s,0});
while(!Q.empty()){
node ch=Q.top();
Q.pop();
int u=ch.u;
int d=ch.d;
if(d!=d1[u])continue;
for(int i=head[u];i;i=a[i].next){
int x=a[i].to,y=a[i].quan;
if(d1[u]+y<d1[x]){
d1[x]=d1[u]+y;
Q.push((node){x,d1[x]});
}
}
}
}
void dj2(int s){
for(int i=1;i<=n;i++)d2[i]=QAQ;
d2[s]=0;
priority_queue<node>Q;
Q.push((node){s,0});
while(!Q.empty()){
node ch=Q.top();
Q.pop();
int u=ch.u;
int d=ch.d;
if(d!=d2[u])continue;
for(int i=head[u];i;i=a[i].next){
int x=a[i].to,y=a[i].quan;
if(d2[u]+y<d2[x]){
d2[x]=d2[u]+y;
Q.push((node){x,d2[x]});
}
}
}
}
void dj3(int s){
for(int i=1;i<=n;i++)d3[i]=QAQ;
d3[s]=0;
priority_queue<node>Q;
Q.push((node){s,0});
while(!Q.empty()){
node ch=Q.top();
Q.pop();
int u=ch.u;
int d=ch.d;
if(d!=d3[u])continue;
for(int i=head[u];i;i=a[i].next){
int x=a[i].to,y=a[i].quan;
if(f[x])continue;
if(d3[u]+y<d3[x]){
d3[x]=d3[u]+y;
Q.push((node){x,d3[x]});
}
}
}
}
int main(){
n=read();m=read();k=read();
for(int i=1;i<=k;i++)f[read()]=1;
for(int i=1;i<=m;i++){
int a=read(),b=read(),c=read();
add(a,b,c);
add(b,a,c);
}
int x,y;
x=read();y=read();
dj1(1);dj2(x);
dj3(1);
int ans=1e9;
ans=min(ans,d1[x]+d2[y]);
ans=min(ans,d1[y]+d2[y]);
ans=min(ans,max(d1[x],d3[y]));
ans=min(ans,max(d3[x],d1[y]));
cout<<ans<<endl;
}
luogu P4943 密室 |最短路的更多相关文章
- 题解 luogu P1144 【最短路计数】
本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...
- 【Luogu】P1144最短路计数(BFS)
题目链接 此题使用BFS记录最短路的条数.思路如下:因为是无权无向图,所以只要被BFS到就是最短路径.因此可以记录该点的最短路和最短路的条数:如果点y还没被访问过,则记录dis[y],同时令ans[y ...
- LUOGU P1342 请柬(最短路)
传送门 解题思路 又是一道语文题,弄清楚题意之后其实就能想出来了,从1跑一遍最短路,把$dis[n]$加入答案.在建个反图跑一遍最短路,把$dis[n]_$加入最短路就行了.第一遍是去的时候,第二遍是 ...
- luogu 1608 路径统计--最短路计数
https://www.luogu.org/problemnew/show/P1608 题意https://www.cnblogs.com/rmy020718/p/9440588.html相似,建议还 ...
- Luogu P3489 [POI2009]WIE-Hexer 最短路
https://www.luogu.org/problemnew/show/P3489 普通的最短路,不过我觉得这个复杂度按道理来说边数不应该是m*2^13吗,不知道是数据比较水还是实际上能证明复杂度 ...
- luogu题解 P2886 【牛继电器Cow Relays】-经过K边最短路&矩阵
题目链接: https://www.luogu.org/problemnew/show/P2886 Update 6.16 最近看了下<算法导论>,惊奇地发现在在介绍\(APSP\) \( ...
- BZOJ 4898 Luogu P3778 [APIO2017]商旅 (分数规划、最短路)
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4898 (luogu)https://www.luogu.org/probl ...
- [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)
题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...
- [Luogu P1613]跑路 (DP+倍增+最短路)
题面 传送门:https://www.luogu.org/problemnew/show/P1613 Solution 挺有意思的一道题. 题面已经挺明显的描述出了这题的主要思想:倍增. 先这样想,我 ...
随机推荐
- Android 开发中是否应该使用枚举?
本文由咕咚发布在个人博客,转载请注明出处. 本文永久地址:https://gudong.name/2019/11/04/use-enum-or-not.html 在 Android 官方文档推出性能优 ...
- java中 equals和==区别
一.java当中的数据类型和“==”的含义: 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean.他们之间的比较,应用双等号 ...
- Windows终端利器Cmder
在IT这一行,大部分情况下都是推荐大家使用Linux或者类Unix操作系统去编程,Linux作为一代优秀的操作系统,已经人尽皆知,在IT行业已经成为核心.有条件的大佬都选择了使用mac编程,最优秀的莫 ...
- idea 常用功能
Ctrl + E:打开最近文件 双击 Shift:按文件名查找文件 Ctrl + Shift + F:全局搜索 Alt + ~(数字 1 左边的键):commit.push 代码 ...
- nyoj 20-吝啬的国度 (DFS)
20-吝啬的国度 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:12 submit:43 题目描述: 在一个吝啬的国度里有N个城市,这N个城市间只有 ...
- nyoj 67-三角形面积 (海伦公式, 叉积)
67-三角形面积 内存限制:64MB 时间限制:3000ms 特判: No 通过数:8 提交数:13 难度:2 题目描述: 给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积 输入描 ...
- HTML_本地存储
在HTML5当中,新增了很多的存储方式,这里我先介绍两种,方便我们的使用和操作,具体新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问 ...
- 解决php使用支付宝SDK报错问题
最近公司将一些项目转移了服务器,后来发现使用支付宝支付时发现出现错误,错误如下: 1 The each() function is deprecated. This message will be s ...
- 程序员常用6 个 Python 的日期时间库
内建的 datetime 模块 在跳转到其他库之前,让我们回顾一下如何使用 datetime 模块将日期字符串转换为 Python datetime 对象. 假设我们从 API 接受到一个日期字符串, ...
- 人生若只如初见---Spring概述以及环境的搭建
Spring 是什么 Spring是由Apache开发的一种轻量型Java框架,能够更加便捷使用JavaBean(之前只有EJB才能实现) Spring的主要优势:分层架构: DAO层:(Data A ...