50分代码求调悬关
查看原帖
50分代码求调悬关
849113
zhangshuhang2011楼主2024/10/17 22:00
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, m, k, val[2502];
vector<int> lnk[2502];
int dist[2502][2502];
void init1(){
    bool vis[2502];
    for(int i = 1; i <= n; i++){
        queue<int> q;
        q.push(i);
        memset(vis, 0, n+2);
        vis[i] = 1;
        dist[i][i] = 0;
        while(!q.empty()){
            int u = q.front();
            q.pop();
            for(int v : lnk[u]){
                if(vis[v]) continue;
                vis[v] = 1;
                dist[i][v] = dist[i][u] + 1;
                q.push(v);
            }
        }
    }
}
int f[2502][3];
void init2(){
    for(int i = 2; i <= n; i++){
        for(int j = 2; j <= n; j++){
            if(i == j) continue;
            if(dist[1][j] <= k+1 && dist[i][j] <= k+1){
                int j2 = j;
                if(val[j2] > val[f[i][0]]){
                    swap(j2, f[i][0]);
                }
                if(val[j2] > val[f[i][1]]){
                    swap(j2, f[i][1]);
                }
                if(val[j2] > val[f[i][2]]){
                    swap(j2, f[i][2]);
                }
            }
        }
    }
}
int calc(){
    int ans = 0;
    for(int b = 1; b <= n; b++){
        for(int c = 1; c <= n; c++){
            if(b != c && dist[b][c] <= k+1){
                for(int a : f[b]){
                    for(int d : f[c]){
                        if(a!=0 && b!=0 && a!=c && b!=d && a!=d){
                            ans = max(ans, val[a]+val[b]+val[c]+val[d]);
                        }
                    }
                }
            }
        }
    }
    return ans;
}
signed main(){
    cin >> n >> m >> k;
    for(int i = 2; i <= n; i++){
        cin >> val[i];
    }
    for(int i = 1; i <= m; i++){
        int u, v;
        cin >> u >> v;
        lnk[u].push_back(v);
        lnk[v].push_back(u);
    }
    init1();
    init2();
    cout << calc();
    return 0;
}
2024/10/17 22:00
加载中...