- 枚举访问\(5\)个亲戚顺序的全排列
- 有了全排列后,现在缺少每个亲戚到其他亲戚的最短距离
- 于是跑\(6\)次\(dijkstra\)算法
const int N=50010;
vector<PII> g[N];
int dist[10][N];
bool vis[N];
int sta[10];
bool st[10];
int n,m;
int ans=INF;
void dijkstra(int u,int s)
{
memset(dist[u],0x3f,sizeof dist[u]);
memset(vis,0,sizeof vis);
priority_queue<PII,vector<PII>,greater<PII> > heap;
dist[u][s]=0;
heap.push({0,s});
while(heap.size())
{
int t=heap.top().second;
heap.pop();
if(vis[t]) continue;
vis[t]=true;
for(int i=0;i<g[t].size();i++)
{
int j=g[t][i].fi,w=g[t][i].se;
if(dist[u][j] > dist[u][t] + w)
{
dist[u][j]=dist[u][t]+w;
heap.push({dist[u][j],j});
}
}
}
}
void dfs(int u,int last,int sum)
{
if(sum >= ans) return;
if(u > 5)
{
ans=min(ans,sum);
return;
}
for(int i=1;i<=5;i++)
if(!st[i])
{
st[i]=true;
dfs(u+1,i,sum+dist[last][sta[i]]);
st[i]=false;
}
}
int main()
{
ios;
cin>>n>>m;
for(int i=1;i<=5;i++) cin>>sta[i];
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
g[a].pb({b,c});
g[b].pb({a,c});
}
sta[0]=1;
for(int i=0;i<=5;i++)
dijkstra(i,sta[i]);
dfs(1,0,0);
cout<<ans<<endl;
//system("pause");
}