70pts求调,求求求了
查看原帖
70pts求调,求求求了
320049
Littlestr楼主2022/11/10 06:18
#include<bits/stdc++.h>
#define int long long

using namespace std;

inline int read()                                                                                                                                                                  {int flag = 0,ans = 0;char s = getchar();while (s>'9' || s<'0'){if (s == '-'){   flag = -1;}s = getchar();}while (s<='9' && s>='0'){ans*=10;ans+=s-'0';s = getchar();}if (flag == 0) return ans;return -ans;}

const int N = 2500 + 10;

int b[N][4],a[N],vis[N],dis[N][N],n,m,k,ans;

vector<int> G[N];

struct node{
    int u,step;
};

queue<node> que;

void bfs(int uu){
    while (!que.empty()) que.pop();
    memset(vis,0,sizeof vis);
    que.push({uu,0});
    while (!que.empty()){
        node s = que.front();
        que.pop();
        if (vis[s.u]) continue;
        dis[uu][s.u] = s.step;
        vis[s.u] = 1;
        for (int i = 0;i < G[s.u].size(); ++ i){
            int j = G[s.u][i];
            if (!vis[j]){
                que.push({j,s.step + 1});
            }
        }
    }
}

signed main(){
    n = read();
    m = read();
    k = read();
    for (int i = 2;i <= n;++i){
        a[i] = read();
    }
    for (int j = 1;j<=m;++j){
        int u = read();
        int v = read();
        G[u].push_back(v);
        G[v].push_back(u);
    }
    for (int i = 1;i<=n;++i){
        bfs(i);
    }
    k ++;
    memset(b,0,sizeof b);
    for (int i = 2;i<=n;++i){//B/C
        for (int j = 2;j<=n;++j){
            if (i == j) continue;
            if (dis[i][j] <= k && dis[1][j] <= k){
                if (a[j] > a[b[i][1]]){
                    b[i][3] = b[i][2];
                    b[i][2] = b[i][1];
                    b[i][1] = j;
                }
                else if (a[j] > a[b[i][2]]){
                    b[i][3] = b[i][2];
                    b[i][2] = j;
                }
                else if (a[j] > a[b[i][3]]){
                    b[i][3] = j;
                }
            }
        }
    }
//  for (int i = 1;i<=n;++i){
//      for (int j = 1;j<=3;++j){
//          cout<<b[i][j]<<" ";
//      }cout<<endl;
//  }
    for (int i = 2;i<=n;++i){
        for (int j = 2;j<=n;++j){
            if (i == j) continue;
            if (dis[i][j] > k) continue;
            for (int B = 1;B<=3;++B){
                if (!b[i][B]) break;
                for (int C = 1;C<=3;++C){
                    if (!b[j][C]) break;
                    if (b[i][B] == b[j][C]) continue;
                    if (b[i][B] == j) continue;
                    if (b[j][C] == i) continue;
                    ans = max(ans,a[b[i][B]] + a[i] + a[j] + a[b[j][C]]);
                }
            }
        }
    }
    cout<<ans;
    return 0;
}
2022/11/10 06:18
加载中...