悬赏1关注,MnZn刚学OI三毫秒,80分求调
查看原帖
悬赏1关注,MnZn刚学OI三毫秒,80分求调
524906
刘辰雨楼主2023/3/13 09:15

RT

WA #5,使用迪杰斯特拉+堆优化

#include <iostream>
#include <cstdio>
#include <vector>
#include <map>
#include <bitset>
#include <queue>
#include <algorithm>
#define maxn 50004
using namespace std;
const int INF = 0x3f3f3f3f;

int n, m;
int arr[6];
int rela[7];
int x, y, t;
int ans = INF;
int dis[maxn][7];
vector<int> edge[maxn];
map<int, int> mp[maxn];
bitset<maxn> vist;
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;

void better_dijkstra(int root) {
	for(int i = 1 ; i<= n ; i++) {
		dis[i][root] = INF;
	}
	dis[rela[root]][root] = 0;
	vist.reset();
	while(!q.empty()) {
		q.pop();
	}
	q.push({0, rela[root]});
	while(!q.empty()) {
		int ben = q.top().second;
		int v = q.top().first;
		q.pop();
		if(vist[ben]) {
			continue;
		} else {
			vist[ben] = true;
		}
		for(int tmp : edge[ben]) {
			if(vist[tmp]) {
				continue;
			} else {
				if(dis[tmp][root] > v+mp[ben][tmp]) {
					dis[tmp][root] = v+mp[ben][tmp];
					q.push({dis[tmp][root], tmp});
				}
			}
		}
	}
	return ;
}

void make_edge(int L1, int L2, int V) {
	edge[L1].push_back(L2);
	mp[L1].insert({L2, V});
	return ;
}

int main() {
	scanf("%d%d", &n, &m);
	for(int i = 2 ; i<= 6 ; i++) {
		scanf("%d", &rela[i]);
	}
	rela[1] = 1;
	for(int i = 1 ; i<= m ; i++) {
		scanf("%d%d%d", &x, &y, &t);
		make_edge(x, y, t);
		make_edge(y, x, t);
	}
	for(int i = 1 ; i<= 6 ; i++) {
		better_dijkstra(i);
	}
	for(int i = 1 ; i<= 5 ; i++) {
		arr[i] = i+1;
	}
	for(int i = 1 ; i<= 120 ; i++) {
		int r = 0;
		for(int j = 2 ; j<= 5 ; j++) {
			r += dis[rela[arr[j-1]]][arr[j]];
		}
		r += dis[1][arr[1]];
		ans = min(ans, r);
		next_permutation(arr+1, arr+6);
	}
	printf("%d\n", ans);
	return 0;
} 
2023/3/13 09:15
加载中...