CQOI新年好
重庆城里有n个车站,m条双向公路连接其中的某些车站。每两个车站最多用一条公路连接,从任何一个车站出发都可以经过一条或者多条公路到达其他车站,但不同的路径需要花费的时间可能不同。在一条路径上花费的时间等于路径上所有公路需要的时间之和。
佳佳的家在车站1,他有五个亲戚,分别住在车站a,b,c,d,e。过年了,他需要从自己的家出发,拜访每个亲戚(顺序任意),给他们送去节日的祝福。怎样走,才需要最少的时间?
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
/*
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*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<new>
#include<queue>
#include<iostream>
using
namespace
std;
int
s[7];
int
dis[7][50001];
int
n;
int
m,u,v,w,ans=2e9;
bool
pg[50001];
int
flag[7];
int
ll[7];
int
ne[300001],fir[50001],val[300001],to[300001],tot;
void
add(
int
u,
int
v,
int
w)
{
to[++tot]=v;val[tot]=w;ne[tot]=fir[u];fir[u]=tot;
}
queue<
int
> q;
int
doit()
{
int
lol=0;
for
(
int
i=1;i<=6;i++)
{
lol+=dis[ll[i]][s[ll[i+1]]];
}
ans=min(lol,ans);
}
void
dfs(
int
x)
{
if
(x==6) doit();
for
(
int
i=2;i<=6;i++)
{
if
(!flag[i])
{
flag[i]=1;
ll[x+1]=i;
dfs(x+1);
flag[i]=0;
ll[x+1]=0;
}
}
}
int
main()
{
cin>>n>>m;
s[1]=1;
ll[1]=1;
for
(
int
i=2;i<=6;i++) cin>>s[i];
for
(
int
i=1;i<=m;i++)
{
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
for
(
int
i=1;i<=6;i++)
{
while
(!q.empty())q.pop();
for
(
int
j=1;j<=n;j++) dis[i][j]=1e8;
for
(
int
j=1;j<=n;j++) pg[j]=0;
q.push(s[i]);dis[i][s[i]]=0;pg[s[i]]=1;
while
(!q.empty())
{
int
xx=q.front();
q.pop();pg[xx]=0;
for
(
int
k=fir[xx];k;k=ne[k])
{
int
ttt=to[k];
if
(dis[i][xx]+val[k]<=dis[i][ttt])
{
dis[i][ttt]=dis[i][xx]+val[k];
if
(!pg[ttt])
{
q.push(ttt);
pg[ttt]=1;
}
}
}
}
}
dfs(1);
cout<<ans;
}