思路:
代码;
#include<iostream>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<queue>
using namespace std;
typedef pair<int,int>PII;
const int N=2e5+10;
int idx,e[N],ne[N],w[N],h[N];
int a[7];
int dist1[7][50010];
bool st[N];
int q[N];
int n,m;
int ans;
void add(int a,int b,int c)
{
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void spfa(int x,int dist[])
{
memset(dist,0x3f,4*N);
memset(st,0,sizeof st);
x=a[x];
dist[x]=0;
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push({0, x});
while (heap.size())
{
auto t = heap.top();
heap.pop();
int ver = t.second;
if (st[ver]) continue;
st[ver] = true;
for (int i = h[ver]; ~i; i = ne[i])
{
int j = e[i];
if (dist[j] > dist[ver] + w[i])
{
dist[j] = dist[ver] + w[i];
heap.push({dist[j], j});
}
}
}
// st[x]=1;
// int hh=0,tt=1;
// q[0]=x;
// while(hh!=tt)
// {
// int t=q[hh++];
// if(hh==N)
// hh=0;
// st[t]=false;
// for(int i=h[t];i!=-1;i=ne[i])
// {
// int j=e[i];
// if(dist[j]>dist[t]+w[i])
// {
// dist[j]=dist[t]+w[i];
// if(!st[j])
// {
// st[j]=1;
// q[tt++]=j;
// if(tt==N)
// tt=0;
// }
// }
// }
// }
}
void dfs(int x,int sum,int u)
{
if(sum>ans) return;
if(u==5)
{
ans=min(ans,sum);
return;
}
for(int i=2;i<=6;i++)
{
if(st[i])
continue;
st[i]=1;
dfs(i,sum+dist1[x][a[i]],u+1);
st[i]=0;
}
return;
}
int main()
{
memset(h,-1,sizeof h);
cin>>n>>m;
a[1]=1;
for(int i=2;i<=6;i++)
cin>>a[i];
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
for(int i=1;i<=6;i++)
{
spfa(i,dist1[i]);
}
memset(st,0,sizeof st);
ans=0x3f3f3f3f;
dfs(1,0,0);
cout<<ans<<endl;
return 0;
}