比赛 |
CSP2022提高组 |
评测结果 |
AAAAAAAAAWATATAWATTT |
题目名称 |
假期计划 |
最终得分 |
65 |
用户昵称 |
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;
}