WA了#11#42
具体想法就是枚举 a,d 找符合条件的 b,c。
似乎是第28行的问题
#include<bits/stdc++.h>
#define int long long
#define maxe 20005
#define maxn 2505
using namespace std;
int n,m,k,a[maxn],cn[maxn],cnt,ans,f[maxn][10];
bool v[maxn],mp[maxn][maxn];
int tot,lnk[maxn],nxt[maxe],son[maxe];
inline int read(){
int ret=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) ret=ret*10+ch-'0',ch=getchar();
return ret;
}
struct str{
int id,k;
}q[maxn];
bool cmp(int x,int y){
return a[x]>a[y];
}
void BFS(int u){
memset(v,0,sizeof v);int t=1,h=0;q[1]=(str){u,-1};v[u]=1;
while(h!=t){
h++;if(q[h].k==k) continue;
for(int j=lnk[q[h].id];j;j=nxt[j]){
if(v[son[j]]) continue;
q[++t]=(str){son[j],q[h].k+1},v[son[j]]=1;
if(son[j]!=1){f[u][5]=son[j];sort(f[u]+1,f[u]+6,cmp),mp[u][son[j]]=1;}
}
}
}
void add_e(int x,int y){
son[++tot]=y,nxt[tot]=lnk[x],lnk[x]=tot;
}
bool check(int a,int b,int c,int d){
return a!=d&&b!=c&&a!=c&&b!=d&&mp[c][b];
}
signed main(){
n=read(),m=read(),k=read();
for(int i=2;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++){
int x=read(),y=read();
add_e(x,y),add_e(y,x);
}
for(int i=1;i<=n;i++) BFS(i);
for(int i=2;i<=n;i++) if(mp[1][i]) cn[++cnt]=i;
for(int i=1;i<=cnt;i++)
for(int j=1;j<=cnt;j++){
if(cn[i]==cn[j]) continue;
for(int l=1;l<=4;l++){
if(f[cn[i]][l]==0) break;
for(int k=1;k<=4;k++){
if(f[cn[j]][k]==0) break;
if(check(cn[i],f[cn[i]][l],f[cn[j]][k],cn[j])) ans=max(ans,a[cn[i]]+a[cn[j]]+a[f[cn[i]][l]]+a[f[cn[j]][k]]);
}
}
}printf("%lld\n",ans);
return 0;
}