全RE求调
查看原帖
全RE求调
965238
Fwio_楼主2023/11/5 11:05
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N = 50010;
struct Graph{
	int v , w;
};vector<Graph> g[N];
struct Node{
	int ver;
	int distance;
	bool operator < (const Node _) const{
		return _.distance < distance;
	}
};
int n , m;
int stop[7];
int dist[7][N];
int vis[7][N];
int st[7];
int ans = 1e9 + 10;
priority_queue<Node> q;
void dijkstra(int x){
	dist[x][x] = 0;
	q.push({x , 0});
	while(!q.empty()){
		auto t = q.top(); q.pop();
		int ver = t.ver , distance = t.distance;
		if(vis[x][ver]) continue; vis[x][ver] = 1;
		for(int i = 0;i < g[ver].size();i++){
			int j = g[ver][i].v , w = g[ver][i].w;
			if(dist[x][j] > distance + w){
				dist[x][j] = distance + w;
				q.push({j , dist[x][j]});
			}
		}
	}
}
void dfs(int u , int cost , int last){
    if(cost > ans) return ;
	if(u == 6){
		ans = min(ans , cost);
		return ;
	}
	for(int i = 1;i <= 5;i++){
		if(!st[i]){
			st[i] = 1;
			dfs(u + 1 , cost + dist[last][stop[i]] , stop[i]);
			st[i] = 0;
		}
	}
}
int main(){
	cin >> n >> m;
	for(int i = 1;i <= 5;i++) cin >> stop[i];
	while(m--){
		int u , v , w;
		scanf("%d%d%d" , &u , &v , &w);
		g[u].push_back({v , w});
		g[v].push_back({u , w});
	}
	memset(dist , 0x3f , sizeof dist);
	for(int i = 1;i <= 5;i++) dijkstra(stop[i]); dijkstra(1);
	dfs(1 , 0 , 1);
	cout << ans << endl;
	return 0;
}
2023/11/5 11:05
加载中...