比赛 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;
}