题目描述

密室被打开了。###

哈利与罗恩进入了密室,他们发现密室由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;
}

最新文章

  1. php将对象数组转成普通数组
  2. Java_Array数组1
  3. Mybatis与Spring整合,使用了maven管理项目,作为初学者觉得不错,转载下来
  4. ASP.NET Word/Excel 权限问题
  5. go sample-base64
  6. 【推荐】最新国外免费空间网站Hostinger
  7. 黄聪:手机移动端建站Jquery+CSS3+HTML5触屏滑动特效插件、实现触屏焦点图、图片轮展图
  8. http://phantomjs.org/page-automation.html
  9. python程序不支持中文
  10. javascript中使用Map
  11. Trie树详解
  12. LeetCode 617. Merge Two Binary Tree (合并两个二叉树)
  13. php trim源码分析
  14. 【福大软工】 W班级总成绩排名3
  15. [PKUWC2019]Day1 T2 你和虚树的故事
  16. HIT2019春软件构造-&gt;重写hashCode()方法
  17. 为Ubuntu新创建用户创建默认.bashrc并自动加载
  18. C#高阶与初心:(一)List.Add添加的到底是什么?
  19. Codeforces Round #369 (Div. 2)-C Coloring Trees
  20. Fibonacci数列的两种实现方式

热门文章

  1. jquery手机端横屏判断方法
  2. 去重算法,简单粗暴&amp;优化版
  3. [Error]Archive for required library: &#39;C:/Users/fk/.m2/repository/com/sun/xml/bind/jaxb-core/2.2.7/jaxb-core-2.2.7.jar&#39;
  4. WordPress 去掉底部的自豪的采用WordPress
  5. 安装eclipse血泪史
  6. MAC终端中tree命令
  7. Swoft 源码剖析 - Swoole和Swoft的那些事 (Http/Rpc服务篇)
  8. 听说PHP的生成器yield处理大量数据杠杠的
  9. 添加ssh服务构建新镜像-docker commit 方式01
  10. GDG Xi&#39;an DevFest 2019 闪电演讲 -《假如我是一个浏览器》PPT(经典多图,建议收藏)