我的删边非常诡异,但是应该是对的
调了很久了,望大佬指正
1、2、4、10WA,9RE
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int n,m,k,cnt,vis[N],ct[N];
int hd[N],to[N<<1],val[N<<1],nxt[N<<1];
long long dis[N];
vector<int>vec1[N],vec2[N];
void add(int u,int v,int w){
to[++cnt]=v;val[cnt]=w;
nxt[cnt]=hd[u];hd[u]=cnt;
}
struct pos{
int id,dist;
bool operator < (const pos x) const {
return dist>x.dist;
}
};
void dij(int s,int t){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
priority_queue<pos>q;
dis[s]=0;q.push((pos){s,0});
// cout<<"dij: "<<s<<endl;
while(!q.empty()){
pos nw=q.top();q.pop();
int u=nw.id;
if(vis[u]) continue;
vis[u]=1;
if(u>n&&u!=s&&u!=t) continue;
//cout<<u<<"*"<<dis[u]<<endl;
if(s<t){
for(int i=0;i<vec1[u].size();i++){
int v=vec1[u][i];
// if(s==9||s==10) cout<<" v"<<v<<endl;
if(v!=s&&dis[v]>dis[u])
dis[v]=dis[u],
q.push((pos){v,dis[v]});
}
} else {
for(int i=0;i<vec2[u].size();i++){
int v=vec2[u][i];
// if(s==9||s==10) cout<<" v"<<v<<endl;
if(v!=s&&dis[v]>dis[u])
dis[v]=dis[u],
q.push((pos){v,dis[v]});
}
}
for(int i=hd[u];i;i=nxt[i]){
int v=to[i];
// if(s==9||s==10) cout<<" v"<<v<<endl;
if(dis[v]>dis[u]+val[i])
dis[v]=dis[u]+val[i],
q.push((pos){v,dis[v]});
}
}
return;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&k);
cnt=0;
memset(hd,0,sizeof(hd));
memset(nxt,0,sizeof(nxt));
memset(to,0,sizeof(to));
memset(val,0,sizeof(val));
for(int i=1,u,v,w;i<=m;i++)
scanf("%d%d%d",&u,&v,&w),add(u,v,w);
for(int i=1;i<=k;i++) scanf("%d",&ct[i]);
long long ans=5e18;
for(int i=0;(1<<i)<=n;i++){
for(int j=1;j<=n;j++) vec1[j].clear(),vec2[j].clear();
int s=n+2*i+1,t=s+1;
// cout<<"new: "<<"i: "<<i<<" "<<(1<<i)<<endl;
for(int j=1;j<=k;j++){
if(ct[j]&(1<<i)) vec1[s].push_back(ct[j]),vec2[ct[j]].push_back(s);
else vec2[t].push_back(ct[j]),vec1[ct[j]].push_back(t);
}
dij(s,t);//cout<<"dis: "<<dis[t]<<endl;
ans=min(dis[t],ans);
// cout<<"---"<<endl;
dij(t,s);//cout<<"dis: "<<dis[s]<<endl;
ans=min(dis[s],ans);
}
printf("%lld\n",ans);
}
return 0;
}