一道黄题……
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
long long n,m,relative[8],num[50005],judge[50005],tot,dijkstra[8][50005],judge_dfs[8],minx=0x3f3f3f3f,s,now;
struct node{
long long end;
long long len;
long long next;
}edge[200005];
priority_queue<pair<long long,int> >que;
void search_dfs(int step,long long sum,int nows){
if(sum>=minx)return;
if(step==6){
minx=min(minx,sum);
return;
}
for(int i=2;i<=6;i++){
if(judge[i])continue;
judge[i]=1;
search_dfs(step+1,sum+dijkstra[nows][relative[i]],i);
judge[i]=0;
}
}
void graph_Dijkstra(){
while(!que.empty())que.pop();
memset(judge,0,sizeof(judge));
dijkstra[now][s]=0;
que.push(make_pair(0,s));
while(!que.empty()){
int x=que.top().second;
que.pop();
if(judge[x])continue;
judge[x]=1;
for(int i=num[x];i;i=edge[i].next){
if(dijkstra[now][edge[i].end]>dijkstra[now][x]+edge[i].len){
dijkstra[now][edge[i].end]=dijkstra[now][x]+edge[i].len;
que.push(make_pair(-dijkstra[now][edge[i].end],edge[i].end));
}
}
}
}
void add(int start,int end,long long len){
edge[++tot].end=end;
edge[tot].len=len;
edge[tot].next=num[start];
num[start]=tot;
}
int main(){
memset(dijkstra,0x3f,sizeof(dijkstra));
scanf("%d%d",&n,&m);
relative[1]=1;
for(int i=2;i<=6;i++)scanf("%d",&relative[i]);
for(int i=1;i<=m;i++){
int lin_a,lin_b,lin_c;
scanf("%d%d%d",&lin_a,&lin_b,&lin_c);
add(lin_a,lin_b,lin_c);
add(lin_b,lin_a,lin_c);
}
for(int i=1;i<=6;i++){
now=i;
s=relative[now];
graph_Dijkstra();
}
for(int i=2;i<=6;i++){
judge[i]=1;
search_dfs(2,dijkstra[1][relative[i]],i);
judge[i]=0;
}
printf("%lld",minx);
return 0;
}