堆优化dijkstra+dfs,t了3个点,求调
#include<bits/stdc++.h>
using namespace std;
int n,m,dis[6][50005];
int station[6]={1};
int head[50005],tote;
bool vis[50005],dfsvis[6];
struct edge{
int to,val,nex;
}e[100005];
void addedge(int x,int y,int t){
e[++tote].to=y; e[tote].val=t;
e[tote].nex=head[x];
head[x]=tote;
return;
}
struct node{
int id;
int dis;
node(int idd,int diss){
id=idd; dis=diss;
}
};
bool operator<(node x,node y){
return x.dis>y.dis;
}
priority_queue<node>q;
int ans=1e9;
void dfs(int x,int y){
if(y>ans){
return;
}
bool flag=0;
for(int i=0;i<=5;i++){
if(dfsvis[i]) continue;
flag=1;
dfsvis[i]=1;
dfs(i,y+dis[x][station[i]]);
dfsvis[i]=0;
}
if(!flag){
ans=min(ans,y);
}
return;
}
int main(){
memset(head,-1,sizeof(head));
memset(dis,0x3f,sizeof(dis));
cin>>n>>m;
for(int i=1;i<=5;i++) cin>>station[i];
for(int i=1,x,y,t;i<=m;i++){
scanf("%d%d%d",&x,&y,&t);
addedge(x,y,t);
addedge(y,x,t);
}
for(int j=0;j<=5;j++){
memset(vis,0,sizeof(vis));
q.push(node(station[j],0));
dis[j][station[j]]=0;
while(!q.empty()){
node tmp=q.top();
q.pop();
if(!vis[tmp.id]){
vis[tmp.id]=1;
for(int i=head[tmp.id];i!=-1;i=e[i].nex){
if(dis[j][e[i].to]>dis[j][tmp.id]+e[i].val){
dis[j][e[i].to]=dis[j][tmp.id]+e[i].val;
q.push(node(e[i].to,dis[j][e[i].to]));
}
}
}
}
}
dfsvis[0]=1;
dfs(0,0);
cout<<ans;
return 0;
}