比赛 CSP2022提高组 评测结果 AAAAAAAAAWATATAWATTT
题目名称 假期计划 最终得分 65
用户昵称 Lfc_HeSn 运行时间 11.761 s
代码语言 C++ 内存使用 75.10 MiB
提交时间 2022-10-30 11:20:49
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 3010;
int n, m, k, a[MAXN], dis[MAXN][MAXN], dis1[MAXN];
int cs[MAXN], cs1[MAXN], cnt, cnt1, ans;
bool vis[MAXN];
vector<int> cd[MAXN];
signed main() {
 	freopen("csp2022_holiday.in", "r", stdin);
 	freopen("csp2022_holiday.out", "w", stdout);
	cin >> n >> m >> k;
	for(int i = 1; i < n; i ++) {
		cin >> a[i + 1];
	}
	for(int i = 1; i <= m; i ++) {
		int x, y;
		cin >> x >> y;
		cd[x].push_back(y);
		cd[y].push_back(x);
	}
	queue<int> q;
	q.push(1);
	memset(dis, 0x3f, sizeof(dis));
	dis[1][1] = -1;
	while(!q.empty()) {
		int x = q.front();
		q.pop();
		vis[x] = 0;
		for(int i = 0; i < cd[x].size(); i ++) {
			int u = cd[x][i];
			if(dis[1][u] > dis[1][x] + 1) {
				dis[1][u] = dis[1][x] + 1;
				if(!vis[u]) {
					vis[u] = 1;
					q.push(u);
				}
			}
		}
	}
	for(int i = 2; i <= n; i ++) {
		if(dis[1][i] <= k) {
			cs[++ cnt] = i;
		}
	}
	for(int i = 1; i <= cnt; i ++) {
		int x = cs[i];
		dis[x][x] = -1;
		q.push(x);
		while(!q.empty()) {
			int u = q.front();
			q.pop();
			vis[u] = 0;
			for(int i = 0; i < cd[u].size(); i ++) {
				int v = cd[u][i];
				if(dis[x][v] > dis[x][u] + 1) {
					dis[x][v] = dis[x][u] + 1;
					if(!vis[v]) {
						vis[v] = 1;
						q.push(v);
					}
				}
			}
		}
	}
	for(int i = 1; i <= cnt; i ++) {
		cnt1 = 0;
		for(int j = 2; j <= n; j ++) {
			if(dis[cs[i]][j] <= k && j != cs[i]) {
				cs1[++ cnt1] = j;
			}
		}
		
		memset(dis1, 0x3f, sizeof(dis1));
		
		for(int j = i + 1; j <= cnt; j ++) {
			
			for(int l = 1; l <= cnt1; l ++) {
				
				int x = cs1[l];
				dis[x][x] = -1;
				q.push(x);
				while(!q.empty()) {
					int u = q.front();
					q.pop();
					vis[u] = 0;
					for(int i = 0; i < cd[u].size(); i ++) {
						int v = cd[u][i];
						if(dis[x][v] > dis[x][u] + 1) {
							dis[x][v] = dis[x][u] + 1;
							if(!vis[v]) {
								vis[v] = 1;
								q.push(v);
							}
						}
					}
				}
				int maxn = 0, num;
				for(int i1 = 2; i1 <= n; i1 ++) {
					if(i1 != cs[i] && i1 != cs[j] && i1 != cs1[l] && cs[j] != cs1[l]) {
						if(dis[x][i1] <= k && dis[cs[j]][i1] <= k) {
							if(a[i1] > maxn) {
								num = i1;
							}
							maxn = max(maxn, a[i1]);
						}
					}
				}
				if(num == cs1[l]) {
					continue;
				}
				ans = max(ans, maxn + a[cs[i]] + a[cs[j]] + a[cs1[l]]);
//				cout << cs[i] << ' ' << cs[j] << ' ' << cs1[l] << ' ' << num << ' ' << (num == cs1[l]) << ' ' << maxn + a[cs[i]] + a[cs[j]] + a[cs1[l]] << endl;
			}
		}
	}
	cout << ans;
	return 0;
}