比赛 |
20250527CSP-S模拟 |
评测结果 |
|
题目名称 |
假期计划 |
最终得分 |
0 |
用户昵称 |
XZDZD |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2025-05-27 15:59:59 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
const int N = 2500 + 10;
using namespace std;
int n, m, k;
int v[N];
int dis[N][N];
vector <int> G[N];
vector <int> b1;
vector <int> b2;
bool vis [N][N];
void bfs (int s) {
queue <int> q;
memset (dis[s],1000000,sizeof(dis[s]));
q.push(s);
dis[s][s] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (auto v : G[u]) {
if (dis[s][v] > dis[s][u] + 1) {
dis[s][v] = dis[s][u] + 1;
q.push(v);
}
}
}
}
signed main() {
freopen("csp2022_holiday.in","r",stdin);
freopen("csp2022_holiday.out","w",stdout);
cin >> n >> m >> k;
for (int i = 2; i <= n; ++i) cin >> v[i];
v[1] = 0;
for (int i = 1; i <= m; ++i) {
int x, y; cin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
}
for (int i = 1; i <= n; ++i) bfs(i);
int big1 = 1, big2 = 1;
for (int i = 2; i <= n; ++i) {
if (dis[1][i] <= k + 1) {
if (v[i] > v[big1]) {
big1 = i;
}else if (v[i] > v[big2]) {
big2 = i;
}
}
}
for (int i = 2; i <= n; ++i) {
if (dis[1][i] <= k + 1) {
if (v[i] > v[big1] && i != big1) {
big1 = i;
}else if (v[i] > v[big2] && i != big1) {
big2 = i;
}
}
}
for (int i = 2; i <= n; ++i) {
if (dis[big1][i] <= k + 1) b1.push_back(i);
if (dis[big2][i] <= k + 1) b2.push_back(i);
}
int ans1 = -10000;
for (auto p1 : b1) {
for (auto p2 : b2) {
if (dis[p1][p2] <= k + 1 && p1 != p2 && p1 != big1 && p1 != big2 && p2 != big1 && p2 != big2) {
ans1 = max (ans1, v[p1] + v[p2]);
}
}
}
if (ans1 < 0) ans1 = 0;
cout << v[big1] + v[big2] + ans1;
return 0;
}