我们的出发点有许多个,但是终点只有一个,所以我们可以反向建图,化终点为起点,起点为终点,求最短路。
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define x first
#define y second
typedef pair<int,int> PII;
const int N=1e3+10;
const int M=2e4+10;
int n,m,ecnt,k,ans;
int head[N],vis[N];
int d[N];
struct edge {
int u,v,w,next;
} E[M<<1];
void add(int u,int v,int w) {
E[++ecnt].u=u;
E[ecnt].v=v;
E[ecnt].w=w;
E[ecnt].next=head[u];
head[u]=ecnt;
}
void spfa(int s) {//spfa最短路
memset(d,INF,sizeof d);
memset(vis,0,sizeof vis);
vis[s]=1;
queue<int> q;
q.push(s);
d[s]=0;
while(!q.empty()) {
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u]; i; i=E[i].next) {
int v=E[i].v;
if(d[v]>d[u]+E[i].w) {
d[v]=d[u]+E[i].w;
if(!vis[v]) {
vis[v]=1;
q.push(v);
}
}
}
}
}
int main() {
while(cin>>n>>m>>k) {
ecnt=0;
memset(head,0,sizeof head);
for(int i=1; i<=m; i++) {
int u,v,w;
cin>>u>>v>>w;
add(v,u,w);//反向建图
}
spfa(k);
cin>>m;
ans=INF;
for(int i=1; i<=m; i++) {
cin>>k;
ans=min(ans,d[k]);//求出返图最短路
}
if(ans==INF)cout<<"-1"<<endl;
else cout<<ans<<endl;
}
return 0;
}