rt,只T了CCF的最后一个点和sub1的18/20两个点。
#include<bits/stdc++.h>
using namespace std;
const int N=2505,M=10005;
int n,m,k;
long long a[N];
struct edge{
int to,next;
}e[2*M];
int fir[N],np=0;
bool vis[N],con[N][N];
inline void add(int x,int y){
e[++np]=(edge){y,fir[x]};
fir[x]=np;
}
void bfs(int x){
int dep=0;
queue<int>q;
q.push(x);
vis[x]=1;
while(!q.empty()&&dep<=k+1){
int len=q.size();
for(int i=1;i<=len;i++){
int y=q.front();
q.pop();
con[x][y]=1;
con[y][x]=1;
vis[y]=1;
for(int j=fir[y];j;j=e[j].next){
if(vis[e[j].to])continue;
q.push(e[j].to);
}
}
dep++;
}
}
int maxn[N][6];//1 2 3记录下标
int main(){
// freopen("holiday.in","r",stdin);
// freopen("holiday.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=2;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
vis[j]=0;
bfs(i);
}
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(i==j||!con[i][j]||!con[1][j])continue;
if(a[j]<=a[maxn[i][3]])continue;
for(int k=3;k>=1;k--){
if(a[j]>a[maxn[i][k]])maxn[i][k+1]=maxn[i][k];
if(a[j]<=a[maxn[i][k-1]]||k==1){
maxn[i][k]=j;
break;
}
}
}
}
long long ans=0;
for(int b=2;b<=n;b++){
for(int c=b+1;c<=n;c++){
if(b==c||!con[b][c])continue;
for(int A=1;A<=3;A++){
if(maxn[b][A]==c||!maxn[b][A])continue;
for(int d=1;d<=3;d++){
if(maxn[c][d]==b||maxn[c][d]==maxn[b][A]||!maxn[c][d])continue;
ans=max(ans,a[b]+a[c]+a[maxn[b][A]]+a[maxn[c][d]]);
}
}
}
}
printf("%lld",ans);
return 0;
}