第一遍测AC,后面测一直TLE
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=2e6+10;
ll n,m,U[maxn],V[maxn],T[maxn],k,Q,h[maxn],nex[maxn],w[maxn],to[maxn],tot,vis[maxn],d[500][500],ans,K[10],visk[10];
void dfs(ll now,ll fa,ll an){
if(now==k+1){
ans=min(ans,an+d[fa][n]);
return;
}
for(ll i=1;i<=k;i++)if(!visk[i]){
visk[i]=1;
ll u=U[K[i]],v=V[K[i]],t=T[K[i]];
dfs(now+1,u,an+d[fa][v]+t);
dfs(now+1,v,an+d[fa][u]+t);
visk[i]=0;
}
}
void add(ll a,ll b,ll t){
w[++tot]=t;
to[tot]=b;
nex[tot]=h[a];
h[a]=tot;
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=m;i++){
scanf("%lld%lld%lld",U+i,V+i,T+i);
add(U[i],V[i],T[i]);
add(V[i],U[i],T[i]);
}
for(ll x=1;x<=n;x++){
for(ll i=0;i<=n;i++)d[x][i]=1e12;
d[x][x]=0;
for(ll i=1;i<=n;i++)vis[i]=0;
while(true){
ll u=0;
for(ll i=1;i<=n;i++)if(!vis[i]&&d[x][u]>d[x][i])u=i;
if(!u)break;
vis[u]=1;
for(ll i=h[u];i;i=nex[i]){
d[x][to[i]]=min(d[x][to[i]],d[x][u]+w[i]);
}
}
}
scanf("%lld",&Q);
while(Q--){
scanf("%lld",&k);
ans=1e12;
for(ll i=1;i<=k;i++)scanf("%lld",K+i);
dfs(1,1,0);
printf("%lld\n",ans);
}
return 0;
}
求调