暴力都打不满感觉没救了
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2500+10;
int num,ans,root,n,m,k;
int a[MAXN],dis[MAXN][MAXN],vis[MAXN];
vector<vector<int>> edge;
inline void bfs(int r)
{
queue<int> que;
que.push(r);
int stp=0;
while(que.size()){
int cnt=que.size();
while(cnt--){
int x=que.front();
que.pop();
vis[x]=1;
dis[root][x]=stp;
for (int y:edge[x]){
if(!vis[y]) que.push(y);
}
}
stp++;
}
}
bool check(int x,int y,int z,int w)
{
if(dis[1][x]>k+1||dis[x][y]>k+1||dis[y][z]>k+1||dis[z][w]>k+1||dis[w][1]>k+1) return 0;
return 1;
}
signed main()
{
int u,v;
std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
memset(dis,0x3f,sizeof(dis));
cin>>n>>m>>k;
edge.resize(n+1);
for (int i=2;i<=n;i++) cin>>a[i];
for (int i=1;i<=m;i++){
cin>>u>>v;
edge[u].push_back(v);
edge[v].push_back(u);
}
for (int i=1;i<=n;i++){
root=i;
memset(vis,0,sizeof(vis));
bfs(i);
}
for (int i=2;i<=n;i++){
for (int j=2;j<=n;j++){
if(j==i) continue;
for (int x=2;x<=n;x++){
if(x==j||x==i) continue;
for (int y=2;y<=n;y++){
if(y==i||y==j||y==x) continue;
if(check(i,j,x,y)) ans=max(ans,a[i]+a[j]+a[x]+a[y]);
}
}
}
}
cout<<ans<<'\n';
return 0;
}