代码如下
#include<bits/stdc++.h>
using namespace std;
#define MAXN 2005
#define MAXM 10005
#define INF 2147483647
int n,m,K,cnt;
long long value[MAXN],ans=-1;
int head[MAXM],d[MAXN],road[MAXN][MAXN];
int visited[MAXN];
struct node{
int from,to,v,next;
}edge[MAXM];
struct data{
int dis,dz;
};
struct mygreater{
bool operator() (const data &x,const data &y) const{
return x.dis>y.dis;
}
};
void ins(int from,int to,int v){
cnt++;
node f={from,to,v,head[from]};
edge[cnt]=f;
head[from]=cnt;
}
void dijkstra(int s){
priority_queue<data,vector<data>,mygreater >q;
memset(visited,0,sizeof(visited));
for(int i=1;i<=n;i++) d[i]=INF;
d[s]=0;
q.push((data){0,s});
while(!q.empty()){
data f=q.top();
q.pop();
if(visited[f.dz]) continue;
visited[f.dz]=1;
for(int i=head[f.dz];i!=0;i=edge[i].next){
if(!visited[edge[i].to]&&d[edge[i].to]>d[edge[i].from]+edge[i].v){
d[edge[i].to]=d[edge[i].from]+edge[i].v;
q.push((data){d[edge[i].to],edge[i].to});
}
}
}
for(int i=1;i<=n;i++) road[s][i]=d[i]-1;
}
int main(){
scanf("%d%d%d",&n,&m,&K);
for(int i=2;i<=n;i++) scanf("%lld",&value[i]);
value[1]=0;
for(int i=1;i<=m;i++){
int from,to;
scanf("%d%d",&from,&to);
ins(from,to,1);
ins(to,from,1);
}
for(int i=1;i<=n;i++) dijkstra(i);
for(int i=2;i<=n;i++){
long long sum=0;
if(road[1][i]>K) continue;
sum+=value[i];
for(int j=2;j<=n;j++){
if(road[i][j]>K||i==j) continue;
sum+=value[j];
for(int k=2;k<=n;k++){
if(road[j][k]>K||k==j||k==i) continue;
sum+=value[k];
for(int l=2;l<=n;l++){
if(road[k][l]>K||l==k||l==j||l==i||road[l][1]>K) continue;
sum+=value[l];
ans=max(ans,sum);
sum-=value[l];
}
sum-=value[k];
}
sum-=value[j];
}
sum-=value[i];
}
printf("%lld",ans);
return 0;
}