思路: 先将所有经过亲戚的顺序求出来(120种),再进行Dijkstra最短路处理。
#include<bits/stdc++.h>
#define ll long long
#define N 1000100
using namespace std;
ll n,m,head[N],to[N],net[N],w[N],d[N],E,position[N],vis[N],v,ans1,sum=1e9;
ll f[N],ans[100010][100],cnt,a[1000];
void add(int a,int b,int c){
to[E] = b;
net[E] = head[a];
head[a] = E;
w[E] = c;
E++;
}
void dfs(int now){
if(now==n){
cnt++;
for(int i=1;i<=5;i++){
ans[cnt][i]=a[i];
}
return ;
}
for(int i=1;i<=5;i++){
if(f[position[i]]==0){
f[position[i]]=1;
a[now]=position[i];
dfs(now+1);
f[position[i]]=0;
}
}
}
struct node{
ll dis,u;
bool operator<(const node & cmp) const{
return dis>cmp.dis;
}
};
void init(){
memset(head,-1,sizeof(head));
E = 0;
}
priority_queue<node>q;
ll time(int x,int y){
for(int i=1;i<=n+1;i++) d[i]=1e9;
node s;
s.dis=0;
s.u=x;
d[x]=0;
q.push(s);
while(!q.empty()){
node f=q.top();q.pop();
int u=f.u;
for(int i=head[u];i!=-1;i=net[i]){
int v=to[i];
if(d[v]>d[u]+w[i]){
d[v]=d[u]+w[i];
node g;g.dis=d[v];g.u=v;
q.push(g);
}
}
}
return d[y];
}
int main(){
init();
scanf("%lld%lld",&n,&m);
for(int i = 1; i<=5; i++) scanf("%lld",&position[i]);
for(int i = 1; i<=m; i++){
ll x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
ll last=1;
dfs(1);
for(int i=1;i<=cnt;i++){
ans1=0,last=1;
for(int j=1;j<=5;j++){
ans1+=time(last,ans[i][j]);
last=ans[i][j];
}
sum=min(ans1,sum);
}
printf("%lld",sum);
return 0;
}
调了一个小时,实在调不出来,求dalao帮忙(回复必关)