题目描述

密室被打开了。###

哈利与罗恩进入了密室,他们发现密室由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 密室 |最短路的更多相关文章

  1. 题解 luogu P1144 【最短路计数】

    本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...

  2. 【Luogu】P1144最短路计数(BFS)

    题目链接 此题使用BFS记录最短路的条数.思路如下:因为是无权无向图,所以只要被BFS到就是最短路径.因此可以记录该点的最短路和最短路的条数:如果点y还没被访问过,则记录dis[y],同时令ans[y ...

  3. LUOGU P1342 请柬(最短路)

    传送门 解题思路 又是一道语文题,弄清楚题意之后其实就能想出来了,从1跑一遍最短路,把$dis[n]$加入答案.在建个反图跑一遍最短路,把$dis[n]_$加入最短路就行了.第一遍是去的时候,第二遍是 ...

  4. luogu 1608 路径统计--最短路计数

    https://www.luogu.org/problemnew/show/P1608 题意https://www.cnblogs.com/rmy020718/p/9440588.html相似,建议还 ...

  5. Luogu P3489 [POI2009]WIE-Hexer 最短路

    https://www.luogu.org/problemnew/show/P3489 普通的最短路,不过我觉得这个复杂度按道理来说边数不应该是m*2^13吗,不知道是数据比较水还是实际上能证明复杂度 ...

  6. luogu题解 P2886 【牛继电器Cow Relays】-经过K边最短路&矩阵

    题目链接: https://www.luogu.org/problemnew/show/P2886 Update 6.16 最近看了下<算法导论>,惊奇地发现在在介绍\(APSP\) \( ...

  7. BZOJ 4898 Luogu P3778 [APIO2017]商旅 (分数规划、最短路)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4898 (luogu)https://www.luogu.org/probl ...

  8. [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...

  9. [Luogu P1613]跑路 (DP+倍增+最短路)

    题面 传送门:https://www.luogu.org/problemnew/show/P1613 Solution 挺有意思的一道题. 题面已经挺明显的描述出了这题的主要思想:倍增. 先这样想,我 ...

随机推荐

  1. 聚类——密度聚类DBSCAN

    Clustering 聚类 密度聚类——DBSCAN 前面我们已经介绍了两种聚类算法:k-means和谱聚类.今天,我们来介绍一种基于密度的聚类算法——DBSCAN,它是最经典的密度聚类算法,是很多算 ...

  2. canvas线条实践之运动的正方形

    原理说明: 1.通过rect实现正方形的绘制: 2.save保存canvas面板的保存,restore回复保存的canvas面板到初始状态: 3.translate用于改变canvas坐标的起始位置: ...

  3. 关于swoole 定时器有时候无法清除的解决方法

    关于swoole 定时器有时候无法清除的解决方法 有时候start里面写个定时器 有时候你关闭进程的时候 发现定时器还是可以进行 目前只有重启服务器才可以 清除 还有就是ps -ef | grep p ...

  4. DHCP动态管理主机地址

    步骤一:搭建环境 需要Windows 2008 R2 系统  (DHCP服务端)以及 CentOS7 系统客户机(DHCP客户机) 安装DHCP服务程序(这里提示读者,一般安装好CentOS系统之后, ...

  5. 删除Linux的依赖库并进入救援模式恢复

    删除Linux的依赖库并进入救援模式恢复 模拟一下依赖库文件被删,并进入救援模式恢复 系统:CentOS7 一.删除mv的依赖库文件 删除/lib64/libc.so.6 [root@centos7 ...

  6. js控制文本显示的字数,超出显示省略号

    在css中我们说了用css控制文本显示几行,超出用省略号,但这个办法是要完全占满一整行的,偏偏就是有UI设计师就不这么干,是不是很想打他,哈哈哈,我不会的时候都这样子在心里骂设计师的,这么久那么爱搞特 ...

  7. 在react中配置less

    在创建项目之后执行 $ yarn eject 抽离配置文件 会多出config和script文件夹 接下来安装less yarn add less less-loader 或者 npm install ...

  8. 通过 position:fixed 实现底部导航

    通过 position:fixed 实现底部导航 HTML <div id="footer">页脚</div> CSS #footer { clear: b ...

  9. pat 1054 The Dominant Color(20 分)

    1054 The Dominant Color(20 分) Behind the scenes in the computer's memory, color is always talked abo ...

  10. nyoj 58-最少步数 (BFS)

    58-最少步数 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:17 submit:22 题目描述: 这有一个迷宫,有0~8行和0~8列: 1,1,1 ...