#include<bits/stdc++.h>
using namespace std;
int n,m,k,w[2509],f[2509][5],vis[2509],ok[2509][2509],ans;
vector<int> to[2509];
struct Node{
int p,l;
};
void bfs(int s){
// cout<<s<<"**"<<endl;
queue<Node> q;
q.push((Node){s,0});
while(!q.empty()){
Node node=q.front();q.pop();
int p=node.p,l=node.l;
// cout<<p<<endl;
ok[s][p]=1;
if(ok[1][p]&&l){
if(w[p]>=w[f[s][1]]) f[s][3]=f[s][2],f[s][2]=f[s][1],f[s][1]=p;
else if(w[p]>=f[s][2]) f[s][3]=f[s][2],f[s][2]=p;
else if(w[p]>=f[s][3]) f[s][3]=p;
}
if(l==k+1) continue;
for(int i=0;i<to[p].size();i++){
int v=to[p][i];
if(ok[s][v]) continue;
ok[s][v]=1;
q.push((Node){v,l+1});
}
}
ok[s][s]=0;
// for(int i=1;i<=n;i++) cout<<ok[s][i]<<' ';
// cout<<endl;
}
void bfs1(){
queue<Node> q;
q.push((Node){1,0});
while(!q.empty()){
Node node=q.front();q.pop();
int p=node.p,l=node.l;
// cout<<p<<' '<<l<<endl;
if(p!=1) ok[1][p]=1;
if(l==k+1) continue;
for(int i=0;i<to[p].size();i++){
int v=to[p][i];
if(ok[1][v]) continue;
ok[1][v]=1;
q.push((Node){v,l+1});
}
}
ok[1][1]=0;
}
int main(){
cin>>n>>m>>k;
for(int i=2;i<=n;i++) cin>>w[i];
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
to[u].push_back(v);
to[v].push_back(u);
}
bfs1();
// for(int i=1;i<=n;i++) cout<<ok[3][i]<<' ';
// cout<<endl;
for(int i=2;i<=n;i++) bfs(i);
// for(int i=2;i<=n;i++) cout<<i<<' '<<f[i][1]<<' '<<f[i][2]<<' '<<f[i][3]<<endl;
for(int b=2;b<=n;b++){
for(int c=2;c<=n;c++)if(ok[b][c]){
for(int i=1;i<=3;i++){
int a=f[b][i];
if(a==b||a==c||a==0) continue;
for(int j=1;j<=3;j++){
int d=f[c][j];
// cout<<a<<" "<<b<<' '<<c<<' '<<d<<endl;
if(d==a||d==b||d==c||d==0) continue;
// if(w[a]+w[b]+w[c]+w[d]>ans) cout<<a<<' '<<b<<' '<<c<<" "<<d<<endl;
ans=max(ans,w[a]+w[b]+w[c]+w[d]);
}
}
}
}
cout<<ans;
return 0;
}
码风很烂:(
ok[i][j]表示从i能否走到j,f[i][1/2/3]参考了题解第一篇
就想不通哇为什么会RE