#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k;
int a,b,c;
int f[220][1<<11];
int head[200200];
int num[101];
int to[200200];
int next[200200];
int val[200200];
int cnt=0;
int dl[200200];
bool bz[200200];
int ans=21000000;
int h=0,t=0;
void build(int u,int v,int w)
{
to[cnt]=v;
val[cnt]=w;
next[cnt]=head[u];
head[u]=cnt;
cnt++;
}
void spfa(int S)
{
while(h<t)
{
h++;
int x=dl[h];
bz[x]=0;
for(int i=head[x];i!=-1;i=next[i])
{
int y=to[i];
if(f[x][S]+val[i]<f[y][S])
{
f[y][S]=f[x][S]+val[i];
if(!bz[y])
{
bz[y]=1;
t++;
dl[t]=y;
}
}
}
}
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
memset(head,-1,sizeof(head));
memset(f,127/3,sizeof(f));
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&a,&b,&c);
build(a,b,c);
build(b,a,c);
}
for(int i=1;i<=k;i++)
scanf("%d",&num[i]),f[num[i]][1<<(i-1)]=0;
for(int S=1;S<=(1<<k)-1;S++)
{
for(int i=1;i<=n;i++)
for(int T=(S&(S-1));T;T=(S&(T-1)))
{
f[i][S]=min(f[i][T]+f[i][S^T],f[i][S]);
if(f[i][S]!=f[0][0])
t++,dl[t]=i,bz[i]=1;
}
spfa(S);
h=0,t=0;
// memset(bz,0,sizeof(bz));
}
for(int i=1;i<=n;i++)
ans=min(ans,f[i][(1<<k)-1]);
printf("%d",ans);
}
各位大佬看看
样例输出ans为初始值