#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
const int N = 2e5+10;
int e[N],ne[N],h[N],w[N],idx;
int n,m;
int st[N];
int dist[10][N];
int st1[10];
int p[10];
int op[10];
int res = 0x3f3f3f3f;
map<int,int>mp;
priority_queue<PII,vector<PII>,greater<>>heap;
void add(int a,int b,int c){
e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx++;
}
void dfs(int u){
if(u>6){
int last = 1;
int reu = 0;
for(int i=2;i<=6;i++){
reu+=dist[mp[last]][op[i]];
last = op[i];
}
res = min(res,reu);
return;
}
for(int i=2;i<=6;i++){
if(!st1[i]){
op[u] = p[i];
st1[i] =1;
dfs(u+1);
st1[i] = 0;
}
}
}
void dijkstra(int be,int ol)
{
for(int i=1;i<=n;i++)dist[ol][i] = 0x3f3f3f3f;
memset(st,0,sizeof st);
dist[ol][be] = 0;
heap.push({0,be});
while(heap.size()){
auto t = heap.top();
heap.pop();
int distance = t.first,ver = t.second;
if(st[ver])continue;
for(int i=h[ver];~i;i=ne[i]){
int j = e[i];
if(dist[ol][j]>distance+w[i]){
dist[ol][j] = distance + w[i];
heap.push({dist[ol][j],j});
}
}
}
}
int main()
{
cin>>n>>m;
p[1] = 1;
for(int i=2;i<=6;i++)cin>>p[i];
memset(h,-1,sizeof h);
for(int i=1;i<=m;i++){
int a,b,c;cin>>a>>b>>c;
add(a,b,c),add(b,a,c);
}
for(int i=1;i<=6;i++)dijkstra(p[i],i),mp[p[i]] = i;
op[1] = 1;
dfs(2);
cout<<res;
}
新年好 dfs+dijkstra
于 2023-11-10 14:31:33 首次发布