跑两遍dijkstra做的,WA #8,10,11 求条
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll M=100009;
const ll INF=1e18+9;
ll T,n,m,k,c,d1[M],d2[M],from[M],to[M],u,v,w,mn;
bool vis1[M],vis2[M];
vector <ll> G1[M],wG1[M],G2[M],wG2[M];
int main(){
cin>>T;
while(T--){
cin>>n>>m>>k;
for(ll i=1;i<=n;i++) d1[i]=d2[i]=INF,vis1[i]=vis2[i]=0,G1[i].clear(),wG1[i].clear(),G2[i].clear(),wG2[i].clear();
for(ll i=1;i<=m;i++){
cin>>u>>v>>w;
G1[u].push_back(v); wG1[u].push_back(w);
G2[v].push_back(u); wG2[v].push_back(w);
}
priority_queue <pair<ll,ll> > pq;
for(ll i=1;i<=k;i++){
cin>>c; d1[c]=d2[c]=0; from[c]=to[c]=c; pq.push(make_pair(0,c));
}
while(!pq.empty()){
v=pq.top().second; pq.pop();
if(vis1[v]) continue;
vis1[v]=1;
for(ll i=0;i<G1[v].size();i++){
u=G1[v][i],w=wG1[v][i];
if(d1[u]>d1[v]+w){
d1[u]=d1[v]+w; from[u]=from[v]; pq.push(make_pair(-d1[u],u));
}
}
}
while(!pq.empty()){
v=pq.top().second; pq.pop();
if(vis2[v]) continue;
vis2[v]=1;
for(ll i=0;i<G2[v].size();i++){
u=G2[v][i],w=wG2[v][i];
if(d2[u]>d2[v]+w){
d2[u]=d2[v]+w; to[u]=to[v]; pq.push(make_pair(-d2[u],u));
}
}
}
mn=INF;
for(ll i=1;i<=n;i++){
for(ll j=0;j<G1[i].size();j++){
u=G1[i][j],w=wG1[i][j];
if(from[i]!=to[u]) mn=min(mn,d1[i]+w+d2[u]);
}
}
cout<<mn<<endl;
}
return 0;
}