全RE求助!
查看原帖
全RE求助!
755419
jiangfeiyang楼主2023/1/18 12:28
#include<bits/stdc++.h>
using namespace std;
const int N=200005;
const int M=50005;
int n,m,cnt,s,u,v,x;
long long ans=2147483647;
int to[N],nxt[N],head[M],val[N],dis[8][M],a[7];
bool vis[M],vi[M];
void add(int u,int v,int x){
	cnt++;
	nxt[cnt]=head[u];
	head[u]=cnt;
	val[cnt]=x;
	to[cnt]=v;
}
void Dijkstra(int st,int s){
	memset(vis,0,sizeof(vis));
    priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > q; dis[st][val[st]]=0;
    q.push(make_pair(0,st));
    for(int i=1;i<=n;i++) dis[s][i]=2147483647;
	dis[s][st]=0; 
    while(!q.empty()){
    	int u=q.top().second;
		q.pop();
		if(vis[u])continue;
        vis[u]=1;
        for(int e=head[u];e;e=nxt[e]){
        	int v=to[e];
            if(dis[s][v]>dis[s][u]+val[e]){
            	dis[st][v]=dis[st][u]+val[e];
				q.push(make_pair(dis[st][v],v));
            }
        }
    }
}
long long min(long long a,long long b){
	if(a>b) return b;
	return a;
}
void dfs(int x,int y,int z){
	if(x==5){
		ans=min(ans,y);
		return;
	}
	for(int i=1;i<=5;i++){
		if(!vi[i]){
			vi[i]=1;
			dfs(x+1,y+dis[z+1][a[i]],i);
			vi[i]=0;
		}
	}
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=5;i++) cin>>a[i];
	for(int i=1;i<=m;i++){
		cin>>u>>v>>x;
		add(u,v,x);
		add(v,u,x);
	}
	Dijkstra(1,1);
	for(int i=1;i<=5;i++) Dijkstra(a[i],i+1);
	dfs(0,0,0);
	cout<<ans<<endl;
    return 0;
} 
2023/1/18 12:28
加载中...