95pts,最后一个点T掉了,个人怀疑BFS有问题。
#include<bits/stdc++.h>
#define int long long
#define N 3005
using namespace std;
struct star{
int next,to,val;
}e[N*100];
struct node{
int u,step;
};
int n,m,k,dot[N],head[N],cnt,Max[N][4],to[N][4],ans;
bool vis[N][N];
queue<node>q;
void add(int u,int v){
e[++cnt].next=head[u];
head[u]=cnt;
e[cnt].to=v;
}
void bfs(int x){
while(!q.empty()) q.pop();
q.push(node{x,0});
while(!q.empty()){
int t=q.front().u,s=q.front().step;
q.pop();
if(s>k+1) continue;
vis[x][t]=true;
for(int i=head[t];i;i=e[i].next){
int y=e[i].to;
if(vis[x][y]) continue;
q.push(node{y,s+1});
}
}
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=2;i<=n;++i) scanf("%lld",&dot[i]);
for(int i=1,u,v;i<=m;++i){
scanf("%lld%lld",&u,&v);
add(u,v),add(v,u);
}
for(int i=1;i<=n;++i) bfs(i);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(!vis[i][j]||i==j||!vis[1][j]) continue;
if(dot[j]>Max[i][1]){
Max[i][3]=Max[i][2],Max[i][2]=Max[i][1];
Max[i][1]=dot[j];
to[i][3]=to[i][2],to[i][2]=to[i][1];
to[i][1]=j;
}
else if(dot[j]>Max[i][2]){
Max[i][3]=Max[i][2];
Max[i][2]=dot[j];
to[i][3]=to[i][2];
to[i][2]=j;
}
else if(dot[j]>Max[i][3]){
Max[i][3]=dot[j];
to[i][3]=j;
}
}
}
for(int b=2;b<=n;++b){
for(int c=2;c<=n;++c){
if(b==c||!vis[b][c]) continue;
for(int i=1;i<=3;++i){
for(int j=1;j<=3;++j){
int a=to[b][i],d=to[c][j];
if(a==c||d==b||a==d||!a||!d) continue;
ans=max(ans,dot[b]+dot[c]+dot[d]+dot[a]);
}
}
}
}
printf("%lld\n",ans);
return 0;
}