先bfs找每个点能到达的点。排序取前3大。最后6个点wa,看了半天都没找出毛病来...
#include<bits/stdc++.h>
#define int long long
#define _ 2505
#define ull unsigned long long
#define lb long double
#define ls(k) (k)<<1
#define rs(k) (k)<<1|1
using namespace std;
const int mod=0;
inline int read(){
int res=0,ch=getchar(),f=1;
while(!isdigit(ch) and ch!=EOF){
if(ch=='-') f=-1;
ch=getchar();
}
while(isdigit(ch)){
res=(res<<3)+(res<<1)+(ch-'0');
ch=getchar();
}
return res*f;
}
int n,m,k,w[_],ok[_][_];
struct Edge{int next,to;} edge[_<<1];
int head[_],size;
inline void add(int u,int v){edge[++size].to=v,edge[size].next=head[u],head[u]=size;}
int vis[_];
typedef pair<int,int> pii;
inline void bfs(int x){
queue<pii> q;
memset(vis,0,sizeof(vis));
q.push(pii(x,0));
while(!q.empty()){
int now=q.front().first;
int dis=q.front().second;
q.pop();vis[now]=true;
if(dis<=k+1) ok[x][now]=ok[now][x]=true;
else continue;
for(int i=head[now];i;i=edge[i].next){
int to=edge[i].to;
if(vis[to]) continue;
q.push(pii(to,dis+1));
}
}
}
vector<pii> ve[_];
signed main(){
//freopen("holiday.in","r",stdin);
//freopen("holiday.out","w",stdout);
n=read(),m=read(),k=read();
for(int i=2;i<=n;i++) w[i]=read();
for(int i=1,u,v;i<=m;i++) u=read(),v=read(),add(u,v),add(v,u);
for(int i=1;i<=n;i++) bfs(i);
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
if(j==i) continue;
if(ok[1][j]&&ok[j][i]){
int nw=w[j]+w[i];
ve[i].push_back(pii(j,nw));
sort(ve[i].begin(),ve[i].end(),[](pii a,pii b){return a.second>b.second;});
if(ve[i].size()>3) ve[i].erase(--ve[i].end());
}
}
}
int ans=0;
for(int b=2;b<=n;b++){
for(int c=2;c<=n;c++){
if(b==c||(!ok[b][c])) continue;
for(pii i:ve[b]){
for(pii j:ve[c]){
int a=i.first,d=j.first;
if(a==c||a==d||b==d) continue;
ans=max(ans,w[a]+w[b]+w[c]+w[d]);
}
}
}
}
cout<<ans<<endl;
return 0;
}