完力(悲)
#include<bits/stdc++.h>
using namespace std;
struct nod{
long long to,d;
};
struct cmp{
bool operator()(nod x,nod y){
return x.d>y.d;
}
};
priority_queue<nod,vector<nod>,cmp>q;
priority_queue<nod,vector<nod>,cmp>sortq;
long long n,m,k,val[2510],dis[2510][2510],u,v,dp[2510][5],ans=0,pos[2510];
long long t1,t2,t3,t4,ok[2510][2510];
bool vh[2510],f[2510],soe[2510];
vector<long long>w[2510];
void dijkstra(long long st){
memset(vh,0,sizeof(vh));
while(!q.empty()) q.pop();
dis[st][st]=0;
q.push(nod{st,0});
while(!q.empty()){
nod now=q.top();
q.pop();
if(vh[now.to]) continue;
vh[now.to]=1;
for(long long i=0;i<w[now.to].size();++i){
long long nt=w[now.to][i];
if(dis[st][nt]>dis[st][now.to]+1){
dis[st][nt]=dis[st][now.to]+1;
q.push(nod{nt,dis[st][nt]});
}
}
}
}
bool stcmp(long long as,long long bs){
return val[as]>val[bs];
}
int main(){
//freopen("holiday.in","r",stdin);
//freopen("holiday.out","w",stdout);
cin>>n>>m>>k;
k++;
for(long long i=1;i<n;++i){
cin>>val[i+1];
}
for(long long i=1;i<=m;++i){
cin>>u>>v;
w[u].push_back(v);
w[v].push_back(u);
}
memset(dis,127,sizeof(dis));
for(long long i=1;i<=n;++i){
dijkstra(i);
//for(long long j=1;j<=n;++j) cout<<dis[i][j]<<' ';
//cout<<endl;
}
for(long long i=2;i<=n;++i) if(dis[1][i]<=k) soe[i]=1;
memset(pos,0,sizeof(pos));
for(long long i=2;i<=n;++i){
for(long long j=2;j<=n;++j){
if(i==j) continue;
if(dis[i][j]<=k&&soe[j]) ok[i][++pos[i]]=j;
}
//cout<<i<<':'<<endl;
//for(long long j=1;j<=pos[i];++j) cout<<ok[i][j]<<' ';
//cout<<endl;
}
for(long long i=1;i<=n;++i){
sort(ok[i]+1,ok[i]+pos[i]+1,stcmp);
}
for(long long i=2;i<=n;++i){
for(long long j=2;j<=n;++j){
if(i==j||!pos[i]||!pos[j]) continue;
if(ok[i][1]==j&&ok[j][1]==i){
if(pos[i]==1||pos[j]==1);
if(ok[i][2]==ok[j][2]){
if(pos[i]==2&&pos[j]==2);
else if(pos[i]==2) ans=max(ans,val[i]+val[j]+val[ok[j][3]]+val[ok[i][2]]);
else if(pos[j]==2) ans=max(ans,val[i]+val[j]+val[ok[i][3]]+val[ok[j][2]]);
else ans=max(ans,max(val[i]+val[j]+val[ok[j][3]]+val[ok[i][2]],val[i]+val[j]+val[ok[i][3]]+val[ok[j][2]]));
}
else ans=max(ans,val[i]+val[j]+val[ok[i][2]]+val[ok[j][2]]);
}
else if(ok[j][1]==i){
if(pos[j]==1);
else ans=max(ans,val[i]+val[j]+val[ok[i][1]]+val[ok[j][2]]);
}
else if(ok[i][1]==j){
if(pos[i]==1);
else ans=max(ans,val[i]+val[j]+val[ok[j][1]]+val[ok[i][2]]);
}
else if(ok[i][1]==ok[j][1]){
if(pos[i]==1&&pos[j]==1);
else if(pos[i]==1){
if(ok[j][2]==i){
if(pos[j]==2);
else ans=max(ans,val[i]+val[j]+val[ok[i][1]]+val[ok[j][3]]);
}
else ans=max(ans,val[i]+val[j]+val[ok[i][1]]+val[ok[j][2]]);
}
else if(pos[j]==1){
if(ok[i][2]==j){
if(pos[i]==2);
else ans=max(ans,val[i]+val[j]+val[ok[j][1]]+val[ok[i][3]]);
}
else ans=max(ans,val[i]+val[j]+val[ok[j][1]]+val[ok[i][2]]);
}
else{
long long ansi,ansj;
if(ok[i][2]==j){
if(pos[i]==2) ansi=0;
else ansi=val[i]+val[j]+val[ok[i][3]]+val[ok[j][1]];
}
else ansi=val[i]+val[j]+val[ok[i][2]]+val[ok[j][1]];
if(ok[j][2]==i){
if(pos[j]==2) ansj=0;
else ansj=val[i]+val[j]+val[ok[j][3]]+val[ok[i][1]];
}
else ansj=val[i]+val[j]+val[ok[j][2]]+val[ok[i][1]];
ans=max(ans,max(ansi,ansj));
}
}
else ans=max(ans,val[i]+val[j]+val[ok[i][1]]+val[ok[j][1]]);
//cout<<i<<' '<<j<<' '<<ans<<endl;
}
}
cout<<ans<<endl;
return 0;
}
希望ccf数据大水(