题目描述
原题来自:CQOI 2005
重庆城里有 个车站, 条双向公路连接其中的某些车站。每两个车站最多用一条公路连接,从任何一个车站出发都可以经过一条或者多条公路到达其他车站,但不同的路径需要花费的时间可能不同。在一条路径上花费的时间等于路径上所有公路需要的时间之和。
佳佳的家在车站 ,他有五个亲戚,分别住在车站 。过年了,他需要从自己的家出发,拜访每个亲戚(顺序任意),给他们送去节日的祝福。怎样走,才需要最少的时间?
输入格式
第一行: 为车站数目和公路的数目。
第二行: 为五个亲戚所在车站编号。
以下 行,每行三个整数 ,为公路连接的两个车站编号和时间。
输出格式
输出仅一行,包含一个整数 ,为最少的总时间。
样例
样例输入
复制6 6
2 3 4 5 6
1 2 8
2 3 3
3 4 4
4 5 5
5 6 2
1 6 7
样例输出
复制21
_____________________________________________________________________________
写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
_____________________________________________________________________________
#include<bits/stdc++.h>
#define PII pair<int,int>
using namespace std;
int n,m,x,y,z,ans=INT_MAX;
vector<PII>a[1000005];
int dist[1000005];
int person[6];
int c[10005][10005];
bool b[6];
priority_queue<PII,vector<PII>,greater<PII> >Q;
void f(int q){
memset(dist,0x3f3f3f3f,sizeof(dist));
dist[q]=0;
Q.push({0,q});
while(!Q.empty()){
auto t=Q.top();
Q.pop();
int vi=t.second;
for(auto i:a[vi]){
int v=i.second,w=i.first;
if(dist[v]>dist[vi]+w){
dist[v]=dist[vi]+w;
Q.push({dist[v],v});
}
}
}
}
void dfs(int h,int l,int L){
if(h>=ans)return;
if(L==0){
ans=min(h,ans);
return;
}
for(int i=1;i<=5;i++){
if(b[i])continue;
b[i]=true;
dfs(h+c[l][i],i,L-1);
b[i]=false;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=5;i++)cin>>person[i];
for(int i=1;i<=m;i++){
scanf("%d %d %d",&x,&y,&z);
a[x].push_back({z,y});
a[y].push_back({z,x});
}
person[0]=1;
for(int i=0;i<=5;i++){
f(person[i]);
for(int j=0;j<=5;j++){
c[i][j]=dist[person[j]];
}
}
dfs(0,0,5);
cout<<ans;
}