《100pts求调》,WA一个点
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2505,maxm=200005;
int n,m,K,lnk[maxn],tot,que[maxn],dis[maxn][maxn],w[maxn];
bool vis[maxn],p[maxn];
int a[maxn][maxn],len[maxn],Ans;
struct edge{
int to,nxt;
}e[maxm];
int read(){
int ret=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)) ret=(ret<<3)+(ret<<1)+(ch&15),ch=getchar();
return ret*f;
}
void add_e(int x,int y){e[++tot]=(edge){y,lnk[x]},lnk[x]=tot;}
void BFS(int x){
int hed=0,til=1;que[til]=x,vis[x]=1,dis[x][x]=0;
while((hed!=til)){
if(dis[x][que[++hed]]>=K) break;
for(int j=lnk[que[hed]];j;j=e[j].nxt)
if(!vis[e[j].to]) que[++til]=e[j].to,vis[e[j].to]=1,dis[x][e[j].to]=dis[x][que[hed]]+1;
}
if(x==1){for(int i=2;i<=til;i++) p[que[i]]=1;}
for(int i=1;i<=til;i++) vis[que[i]]=0;
if(x!=1) for(int i=2;i<=til;i++) if(p[que[i]]){
a[x][++len[x]]=que[i];
}
}
void Exmax(int &x,int y){if(y>x) x=y;}
bool cmp(int x,int y){return w[x]>w[y];}
signed main(){
// freopen("holiday.in","r",stdin);
// freopen("holiday.out","w",stdout);
memset(dis,63,sizeof dis);
n=read(),m=read(),K=read()+1;
for(int i=2;i<=n;i++) w[i]=read();
for(int i=1;i<=m;i++) {
int x=read(),y=read();
add_e(x,y),add_e(y,x);
}for(int i=1;i<=n;i++) BFS(i);
for(int i=2;i<=n;i++) sort(a[i]+1,a[i]+1+len[i],cmp);
for(int i=2;i<n;i++)
for(int j=i+1;j<=n;j++)if(dis[i][j]!=dis[0][0]){
int k=1,l=1;
while(1){
if(k>len[i]||l>len[j]) break;
if(i==a[j][l]||j==a[i][k]||a[i][k]==a[j][l]){
if(i==a[j][l]) l++;else
if(j==a[i][k]) k++;else
if(k== len[i]) l++;else
if(l== len[j]) k++;else
if(w[a[j][l+1]]+w[a[i][k]]>w[a[j][l]]+w[a[i][k+1]]) l++;else k++;
}else{Exmax(Ans,w[i]+w[j]+w[a[j][l]]+w[a[i][k]]);break;}
}
}printf("%lld\n",Ans);
return 0;
}