RT,谢谢!
#include <bits/stdc++.h>
using namespace std;
const int maxn=10000+5;
int n,m,k,s[2505],ans;
bool G[2505][2505],vis[2505];
vector <int> g[maxn];
vector <int> f[maxn];
struct pos{
int x,cnt;
};
int getsocer(int a,int b,int c,int d){
return s[a]+s[b]+s[c]+s[d];
}
bool cmp(int x,int y){
return x>y;
}
void bfs(int x){
memset(vis,0,sizeof(vis));
queue <pos> q;
q.push({x,0});
while(!q.empty()){
pos now=q.front();
q.pop();
int nu=now.x,nk=now.cnt;
if(vis[nu])continue;
vis[nu]=1;
//cout<<"nu="<<nu<<" nk="<<nk<<endl;
if(nu!=x){
G[x][nu]=1;
if(G[1][nu]&&x!=1){
f[x].push_back(nu);
sort(f[x].begin(),f[x].end(),cmp);
if(f[x].size()>=3)f[x].pop_back();
}
}
if(nk>k)continue;
for(int i=0;i<g[nu].size();i++){
int nnu=g[nu][i];
if(!vis[nnu])q.push({nnu,nk+1});
}
}
}
bool check(int a,int b,int c,int d){
if(a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d)return true;
return false;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=2;i<=n;i++)scanf("%d",&s[i]);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=1;i<=n;i++)bfs(i);
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i!=j){
if(G[i][j]){
for(int a=0;a<f[i].size();a++){
for(int d=0;d<f[j].size();d++){
//cout<<f[i][a]<<' '<<i<<' '<<j<<' '<<f[j][d]<<endl;
if(check(i,j,f[i][a],f[j][d]))ans=max(getsocer(i,j,f[i][a],f[j][d]),ans);
}
}
}
}
}
}
printf("%d",ans);
return 0;
}