比赛 |
CSP2022提高组 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
假期计划 |
最终得分 |
100 |
用户昵称 |
lihaoze |
运行时间 |
1.420 s |
代码语言 |
C++ |
内存使用 |
1.84 MiB |
提交时间 |
2022-10-30 09:20:14 |
显示代码纯文本
#include "bits/stdc++.h"
using i64 = long long;
const int N = 2510;
int n, m, k;
i64 w[N], dist[N], st[N];
std::vector<int> to[N], able[N], best[N];
void get(int x) {
memset(dist, 0x3f, sizeof dist);
memset(st, 0, sizeof st);
std::queue<int> q;
dist[x] = 0, st[x] = true;
q.push(x);
while (q.size()) {
int u = q.front(); q.pop();
st[u] = false;
for (int v : to[u]) {
if (dist[u] + 1 < dist[v]) {
dist[v] = dist[u] + 1;
if (!st[v]) {
q.push(v),
st[v] = true;
}
}
}
}
for (int i = 1; i <= n; ++ i) {
if (dist[i] <= k + 1 && i != x) {
able[x].emplace_back(i);
}
}
}
int main() {
freopen("csp2022_holiday.in", "r", stdin);
freopen("csp2022_holiday.out", "w", stdout);
std::cin >> n >> m >> k;
for (int i = 2; i <= n; ++ i) {
std::cin >> w[i];
}
for (int i = 1; i <= m; ++ i) {
int x, y;
std::cin >> x >> y;
to[x].emplace_back(y),
to[y].emplace_back(x);
}
for (int i = 1; i <= n; ++ i) {
get(i);
}
std::sort(able[1].begin(), able[1].end(), [&] (i64 x, i64 y) {
return w[x] > w[y];
});
for (int u : able[1]) {
for (int v : able[u]) {
if (best[v].size() < 3) {
best[v].emplace_back(u);
}
}
}
i64 ans = 0;
for (int b = 2; b <= n; ++ b) {
for (int c : able[b])
for (int a : best[b])
for (int d : best[c])
if (a != d && a != c && b != d) {
ans = std::max(ans, w[a] + w[b] + w[c] + w[d]);
}
}
std::cout << ans << '\n';
return 0;
}