​题目传送门​​ 代码:

#include<bits/stdc++.h>
using namespace std;

#define min(a,b) (a<b?a:b)
#define pqg(a) priority_queue<a,vector<a>,greater<a> >
#define MEM(a,b,start,end) for(int ii=start;ii<=end;ii++) a[ii]=b;
#define AddEdge2(u,v,len) edge[tot].to=v,edge[tot].len=len,edge[tot].next=head[u],head[u]=tot++
typedef pair<int,int> P;
const int maxn=100000+100;
const int INF=0x3f3f3f3f;

struct Edge{

int to,next,len;
}edge[maxn<<1];
int head[maxn],tot,dis[maxn];
bool to[maxn],vis[maxn];

inline int Dijkstra(){

MEM(dis,INF,1,maxn-1);
MEM(vis,false,1,maxn-1);
dis[maxn-1]=0;
pqg(P) que;
que.push(P(0,maxn-1));
int Min=INF;
while(!que.empty()){

P p=que.top();
que.pop();
int u=p.second;
if(vis[u]) continue;
vis[u]=true;
if(to[u]) Min=min(Min,dis[u]);
for(int i=head[u];i!=-1;i=edge[i].next){

Edge e=edge[i];
int v=e.to;
if(!vis[v] && dis[v]>dis[u]+e.len){

dis[v]=dis[u]+e.len;
que.push(P(dis[v],v));
}
}
}
return Min;
}

int main(){

int t,s,d;
while(scanf("%d%d%d",&t,&s,&d)==3){

MEM(head,-1,1,maxn-1);
MEM(to,false,1,maxn-1);
tot=0;
for(int i=1;i<=t;i++){

int u,v,len;
scanf("%d%d%d",&u,&v,&len);
AddEdge2(u,v,len);
AddEdge2(v,u,len);
}
for(int i=1;i<=s;i++){

int u,v=maxn-1,len=0;
scanf("%d",&u);
AddEdge2(u,v,len);
AddEdge2(v,u,len);
}
for(int i=1;i<=d;i++){

int v;
scanf("%d",&v);
to[v]=true;
}
printf("%d\n",Dijkstra());
}
}