代码如下:
#include<bits/stdc++.h>
#define pii pair<int,int>
#define int long long
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn=2510;
int n,m,k,val[maxn],ans;
int num[maxn][maxn],cnt[maxn],cnt1,cnt2,cnt3,cnt4;
vector<int>G[maxn];
queue<pii>q;
bool mp[maxn][maxn];
void bfs(int s)
{
q.push({s,0});
while(!q.empty())
{
int u=q.front().first,kk=q.front().second;
q.pop();
if(kk==k+1) continue;
for(int v:G[u])
{
if(mp[s][v]) continue;
mp[s][v]=1;
q.push({v,kk+1});
}
}
}
signed main()
{
// freopen("holiday3.in","r",stdin);
n=read(),m=read(),k=read();
for(int i=2;i<=n;i++) val[i]=read();
for(int i=1,u,v;i<=m;i++)
{
u=read(),v=read();
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1;i<=n;i++) bfs(i);
for(int i=2;i<=n;i++) //枚举景点1
for(int j=2;j<=n;j++) //枚举景点2
{
if(i==j) continue;
if(mp[1][i] && mp[i][j]) num[j][++cnt[j]]=i;
}
for(int i=1;i<=n;i++) sort(num[i]+1,num[i]+1+cnt[i],[](int x,int y) {return val[x]>val[y];});
for(int i=2;i<=n;i++)
for(int j=2;j<=n;j++)
{
if(i==j || !mp[i][j] || !cnt[i] || !cnt[j]) continue;
cnt1=cnt2=1;
if(num[i][1]==j)
{
if(cnt[i]==1) continue;
cnt1++;
}
if(num[j][1]==i)
{
if(cnt[j]==1) continue;
cnt2++;
}
if(num[i][cnt1]!=num[j][cnt2])
{
ans=max(ans,val[i]+val[j]+val[num[i][cnt1]]+val[num[j][cnt2]]);
continue;
}
cnt3=cnt1+1,cnt4=cnt2+1;
bool flag1=0,flag2=0;
if(num[i][cnt3]==j)
{
cnt3++;
if(cnt3>cnt[i]) flag1=1;
}
if(num[j][cnt4]==i)
{
cnt4++;
if(cnt4>cnt[j]) flag2=1;
}
if(!flag1) ans=max(ans,val[i]+val[j]+val[num[i][cnt3]]+val[num[j][cnt2]]);
if(!flag2) ans=max(ans,val[i]+val[j]+val[num[i][cnt1]]+val[num[j][cnt4]]);
}
printf("%lld\n",ans);
return 0;
}