40分,后面T,求助
查看原帖
40分,后面T,求助
1147171
Merge_all楼主2024/10/14 22:41
#include<bits/stdc++.h>
#define int long long
#define rg register
#define il inline
#define gc() getchar()
using namespace std;
typedef pair<int,int> PII;
const int N=50010,M=100010;
int n,head[M<<1],idx,dist[N],m,ans=1e15+100,sum,res;
unordered_map<int,int> mp;
int arr[5];
bool vis[N];
struct Edge{
	int v,w,nxt;
}e[M<<1];
struct Node{
	int id,dis;
	bool friend operator<(Node x,Node y){
		return x.dis>y.dis;
	}
};
priority_queue<Node> q;
void add(int u,int v,int w){
	idx++;
	e[idx].v=v,e[idx].w=w,e[idx].nxt=head[u];
	head[u]=idx;
}
int dijkstra(int s,int t){
	for(int i=1;i<=n;i++) dist[i]=1e15+100,vis[i]=false;
	dist[s]=0,q.push({s,0});
	while(q.size()){
		Node u=q.top();q.pop();
		if(vis[u.id]) continue;
		vis[u.id]=true;
		for(int i=head[u.id];i;i=e[i].nxt){
			if(dist[e[i].v]>dist[u.id]+e[i].w){
				dist[e[i].v]=dist[u.id]+e[i].w;
				q.push({e[i].v,dist[e[i].v]});
			}
		}
	}
	return dist[t];
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>n>>m;
	for(int i=0;i<5;i++) cin>>arr[i];
	sort(arr,arr+5);
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z),add(y,x,z);
	}
	for(int i=0;i<5;i++) mp[arr[i]]=dijkstra(1,arr[i]);
	do{
		res=mp[arr[0]];
		for(int i=1;i<5;i++){
			if(res>=ans) break;
			res+=dijkstra(arr[i-1],arr[i]);
		}
		ans=min(ans,res);
	}while(next_permutation(arr,arr+5));
	cout<<ans<<'\n';
	return 0;
}
/*

*/
2024/10/14 22:41
加载中...