HDU3768最短路+状压DP
n<=10,考虑next_permutation()枚举所有情况
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=1e9;
const ll mod=1e9+7;
const int maxn=1e6;
const int N=1e5+5;
int head[maxn],to[maxn],nex[maxn],vis[N],x,y,t,n,m,k,num[N],r,id[N];
ll dis[15][N],w[maxn],z,ans;
struct node{
ll u,num;
bool operator < (const node &x) const{
return u>x.u;
}
};
void add(int a,int b,ll c){
to[++k]=b;
nex[k]=head[a];
head[a]=k;
w[k]=c;
}
void dij(int s,int d){
priority_queue<node>p;
memset(vis,0,sizeof(vis));
for(int i=0;i<=n;i++)
dis[d][i]=inf;
dis[d][s]=0;
p.push((node){0,s});
while(!p.empty()){
node tmp=p.top();p.pop();
int now=tmp.num;
if(vis[now])continue;
vis[now]=1;
for(int i=head[now];i;i=nex[i]){
int y=to[i];
if(!vis[y]&&dis[d][y]>dis[d][now]+w[i]){
dis[d][y]=dis[d][now]+w[i];
p.push((node){dis[d][y],y});
}
}
}
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
k=0;ans=inf;
memset(head,0,sizeof(head));
for(int i=1;i<=m;i++){
scanf("%d%d%lld",&x,&y,&z);
add(x,y,z),add(y,x,z);
}
scanf("%d",&r);
dij(0,0);
for(int i=1;i<=r;i++){
scanf("%d",&x);
id[x]=i;
num[i]=x;
dij(x,i);
}
do{
ll sum=0;
for(int i=1;i<r;i++){
sum+=dis[id[num[i]]][num[i+1]];
}
sum+=dis[0][num[1]]+dis[0][num[r]];
ans=min(ans,sum);
}while(next_permutation(num+1,num+r+1));
printf("%lld\n",ans);
}
}