RT,考场代码,95pts 有一个点死活过不去(
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define pb push_back
#define pii pair<int,int>
#define mkp make_pair
#define ll long long
#define For(i,j,k) for(int i=(j); i<=(k); i++)
#define ForDown(i,j,k) for(int i=(j); i>=(k); i--)
#define Sq(x) (1ll*(x)*(x))
#define Sz(x) ((signed)x.size())
template<typename T> void read(T &x)
{
char c=getchar(); int m=1; x=0;
while(!isdigit(c)) m=c=='-'?-1:m,c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
x*=m;
}
template<typename T, typename ...Args> void read(T &x, Args &...y)
{
read(x); read(y...);
}
const int MAXN=2505;
int n,m,k;
ll val[MAXN],used[MAXN],f[MAXN][3],g[MAXN][3];
vector<int> G[MAXN],to[MAXN];
void BFS(int st)
{ // to[i] 表示第 i 个点能走到的位置
memset(used,-1,sizeof(used)); to[st].clear();
static int q[MAXN<<2];
int front=1,tail=1; q[1]=st,used[st]=0;
while(front<=tail)
{
int u=q[front++];
for(int v: G[u])
{
if(used[v]!=-1) continue;
if(used[u]+1>k) continue;
used[v]=used[u]+1,q[++tail]=v,to[st].pb(v);
}
}
}
bool uni(int a, int b, int c, int d)
{
return a!=b && a!=c && a!=d && b!=c && b!=d && c!=d;
}
signed main()
{
// freopen("holiday.in","r",stdin);
// freopen("holiday.out","w",stdout);
read(n,m,k); k++;
For(i,2,n) read(val[i]);
For(i,1,m)
{
int x,y;
read(x,y);
G[x].pb(y),G[y].pb(x);
}
For(i,1,n) BFS(i);
// cerr<<Sz(to[1])<<endl;
for(int i: to[1])
{
for(int j: to[i])
{
if(i==j) continue;
// 处理前三大
// f 数组记录值,g 数组记录点
if(val[i]+val[j]>=f[j][0])
{
f[j][2]=f[j][1],g[j][2]=g[j][1];
f[j][1]=f[j][0],g[j][1]=g[j][0];
f[j][0]=val[i]+val[j],g[j][0]=i;
}
else if(val[i]+val[j]>=f[j][1])
{
f[j][2]=f[j][1],g[j][2]=g[j][1];
f[j][1]=val[i]+val[j],g[j][1]=i;
}
else if(val[i]+val[j]>=f[j][2])
{
f[j][2]=val[i]+val[j],g[j][2]=i;
}
}
}
ll ans=0;
For(i,2,n) for(int j: to[i])
{
if(i==j) continue;
For(p,0,2) For(q,0,2)
{
if(uni(i,j,g[i][p],g[j][q])) // 4 个点两两不同
{
ans=max(ans,f[i][p]+f[j][q]);
}
}
}
cout<<ans<<endl;
return 0;
}