求调QAQ
(代码有点臭请见谅
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#define int long long
#define ull unsigned long long
using namespace std;
const int INF=1e18;
int n,m,k,score[2505],d[2505][2505],val3[2505][5],ans;
bool vis[2505][2505];
vector<int>v[10005];
void bfs(int k){
queue<int>q;
q.push(k);
vis[k][k]=true;
while(!q.empty()){
int tmp=q.front();
q.pop();
for(int i=0;i<v[tmp].size();i++){
if(!vis[k][v[tmp][i]]){
vis[k][v[tmp][i]]=true;
d[k][v[tmp][i]]=d[k][tmp]+1;
q.push(v[tmp][i]);
}
}
}
}
int max1,max1v,max2,max2v,max3,max3v;
signed main(){
cin>>n>>m>>k;
for(int i=2;i<=n;i++)
cin>>score[i];
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
for(int i=0;i<2505;i++){
for(int j=0;j<2505;j++){
d[i][j]=INF;
}
}
for(int i=1;i<=n;i++){
d[i][i]=0;
bfs(i);
}
for(int i=2;i<=n;i++){//枚举点
max1=max2=max3=max1v=max2v=max3v=0;
for(int j=2;j<=n;j++){//枚举公共点
// cout<<j<<endl;
if(d[1][j]<=k+1&&d[i][j]<=k+1){
if(score[j]>max1v){
max3=max2;
max2=max1;
max3v=max2v;
max2v=max1v;
max1=j;
max1v=score[j];
}else if(score[j]>max2v){
max3=max2;
max3v=max2v;
max2=j;
max2v=score[j];
}else if(score[j]>max3v){
max3=j;
max3v=score[j];
}
}
}
// cout<<max1<<' '<<max1v<<' '<<max2<<' '<<max2v<<' '<<max3<<' '<<max3v<<endl;
val3[i][1]=max1;
val3[i][2]=max2;
val3[i][3]=max3;
}
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(d[i][j]>k+1||i==j)continue;
for(int i1=1;i1<=3&&val3[i][i1];i1++){
for(int j1=1;j1<=3&&val3[j][j1];j1++){
int k=val3[i][i1],h=val3[j][j1];
if(i!=k&&i!=h&&j!=k&&j!=h&&k!=h){
ans=max(ans,score[i]+score[j]+score[h]+score[k]);
}
}
}
}
}
cout<<ans<<endl;
return 0;
}
/*
8 8 1
9 7 1 8 2 3 6
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 1
*/