50,错的地方毫无规律...
#include<bits/stdc++.h>
using namespace std;
int n,m,num,k,f[10001],c[10001],head[10001],li[10001],lii[10001],liii[10001],ti[10001];
long long vl[10001],ans;
bool pan[2601][2601];
struct edge{int to,next,val;}a[100001];
struct node{int dis,id;};
inline void ad(int u,int v,int w){a[++num].to=v; a[num].next=head[u]; a[num].val=w; head[u]=num;}
priority_queue<node>q;
inline bool operator <(node X,node Y){return Y.dis<X.dis;}
inline void dijkstra(int st){
while(!q.empty()) q.pop();
memset(f,0x3f,sizeof(f)); q.push((node){0,st});
memset(c,0,sizeof(c)); f[st]=0;
while(!q.empty()){
node now=q.top(); q.pop();
if(c[now.id]==1) continue; c[now.id]=1;
for(register int i=head[now.id];i!=0;i=a[i].next){
if(f[now.id]+a[i].val<f[a[i].to]){
f[a[i].to]=f[now.id]+a[i].val;
q.push((node){f[a[i].to],a[i].to});
}
}
}
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m>>k; ++k;
for(register int i=2;i<=n;++i) cin>>vl[i];
for(register int i=1;i<=m;++i){
int x,y; cin>>x>>y;
ad(x,y,1); ad(y,x,1);
}
dijkstra(1);
for(register int i=2;i<=n;++i) if(f[i]<=k) ti[i]=1;
for(register int i=2;i<=n;++i){
dijkstra(i);
long long xi=0,xii=0,xiii=0;
for(register int j=2;j<=n;++j) pan[i][j]=(f[j]<=k);
for(register int j=2;j<=n;++j) if(f[j]<=k&&i!=j&&vl[j]>xi) xi=vl[j],li[i]=j;
for(register int j=2;j<=n;++j) if(f[j]<=k&&i!=j&&j!=li[i]&&vl[j]>xii) xii=vl[j],lii[i]=j;
for(register int j=2;j<=n;++j) if(f[j]<=k&&i!=j&&j!=li[i]&&j!=lii[i]&&vl[j]>xiii) xiii=vl[j],liii[i]=j;
}
for(register int i=2;i<=n;++i){
for(register int j=2;j<=n;++j){
if(i==j||pan[i][j]==false) continue;
int yi=0,yii=0;
if(li[i]!=j&&ti[li[i]]==1) yi=li[i];
else if(lii[i]!=j&&ti[lii[i]]==1) yi=lii[i];
else if(liii[i]!=j&&ti[liii[i]]==1) yi=liii[i];
if(yi==0) continue;
if(li[j]!=i&&li[j]!=yi&&ti[li[j]]==1) yii=li[j];
else if(lii[j]!=i&&lii[j]!=yi&&ti[lii[j]]==1) yii=lii[j];
else if(liii[j]!=i&&liii[j]!=yi&&ti[liii[j]]==1) yii=liii[j];
if(yii==0) continue;
if(vl[i]+vl[j]+vl[yi]+vl[yii]>ans) ans=vl[i]+vl[j]+vl[yi]+vl[yii];
}
}
cout<<ans;
return 0;
}