弄了半个上午了... 应该是正解的思路
#include<bits/stdc++.h>
#define TEST cout<<"lzx1013"
#define int long long
using namespace std;
int n, m, k, a[3000], f[3000][5];
int dis[3000][3000];//这里dis先是表示距离,然后表示是否能到达
queue<int> q;
vector<int> g[3000];
void BFS(int x, int st){
q.push(x);
while(!q.empty()){
int u = q.front(); q.pop();
for(auto v : g[u]){
if(dis[st][v] || st == v) continue;
dis[st][v] = dis[st][u] + 1;
q.push(v);
}
}
return;
}
signed main(){
cin >> n >> m >> k;
for(int i = 2; i <= n; i++){
cin >> a[i];
}
while(m--){
int a, b;
cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
for(int i = 1; i <= n; i++){
BFS(i, i);
for(int j = 1; j <= n; j++){
if(dis[i][j] <= k + 1 && i != j) dis[i][j] = 1;
else dis[i][j] = 0;
}
}
for(int i = 2; i <= n; i++){
for(int j = 2; j <= n; j++){ //第一大
if(dis[i][j] && dis[1][j] && a[j] > a[f[i][1]]){
f[i][1] = j;
}
}
for(int j = 2; j <= n; j++){ //第二大
if(dis[i][j] && dis[1][j] && a[j] > a[f[i][2]] && f[i][1] != j){
f[i][2] = j;
}
}
for(int j = 2; j <= n; j++){ //第三大
if(dis[i][j] && dis[1][j] && a[j] > a[f[i][3]] && f[i][1] != j && f[i][2] != j)
f[i][3] = j;
}
}
int ans = 0, ma, mb, mc, md;
for(int b = 2; b <= n; b++){
for(int c = 2; c <= n; c++){
if(!dis[b][c]) continue;
for(int i = 1; i <= 3; i++){
if(f[b][i] == c || f[b][i] == 0) continue;
for(int j = 1; j <= 3; j++){
if(f[c][j] == b || f[c][j] == f[b][i] || f[c][j] == 0) continue;
int sum = a[b] + a[c] + a[f[b][i]] + a[f[c][j]];
if(sum > ans){
ans = sum;
ma = f[b][i]; mb = b; mc = c; md = f[c][j];
}
}
}
}
}
cout << ans;
return 0;
}