代码如下:求助
#include<bits/stdc++.h>
#define ll long long
#define PLL pair<ll,ll>
using namespace std;
const ll N=3010,M=20010;
ll n,m,k,a[N];
ll h[N],e[M*2],ne[M*2],idx;
ll dist[N][N];
bool vis[N];
void add(ll x,ll y)
{
e[idx]=y;
ne[idx]=h[x];
h[x]=idx++;
}
ll lu,dq;
ll ans;
void dijkstra(ll wz)
{
memset(vis,false,sizeof vis);
dist[wz][wz]=0;
priority_queue<PLL,vector<PLL>,greater<PLL> > p;
p.push({0,wz});
while(!p.empty())
{
lu=p.top().first;
dq=p.top().second;
p.pop();
if(vis[dq]) continue;
vis[dq]=true;
// dist[wz][dq]=lu;
for(ll i=h[dq];i!=-1;i=ne[i])
{
ll j=e[i];
if(lu+1<dist[wz][j])
{
dist[wz][j]=lu+1;
p.push({dist[wz][j],j});
}
}
}
}
ll shu[2510][10];
ll t1,t2,t3,t4,t5,t6;
int main()
{
memset(h,-1,sizeof h);
ll x,y;
scanf("%lld %lld %lld",&n,&m,&k);
k++;
for(ll i=2;i<=n;i++)
scanf("%lld",&a[i]);
for(ll i=1;i<=m;i++)
{
scanf("%lld %lld",&x,&y);
add(x,y);
add(y,x);
}
memset(dist,0x3f3f3f3f3f3f,sizeof dist);
for(ll i=1;i<=n;i++)
dijkstra(i);
for(ll i=2;i<=n;i++)
{
for(ll j=2;j<=n;j++)
{
if(i==j) continue;
if(dist[1][i]<=k&&dist[i][j]<=k)
{
t1=shu[j][1];
t2=shu[j][2];
t3=shu[j][3];
t4=shu[j][4];
t5=shu[j][5];
t6=shu[j][6];
if(a[i]>a[t6]) t6=i;
if(a[t6]>a[t5]) swap(t6,t5);
if(a[t5]>a[t4]) swap(t5,t4);
if(a[t4]>a[t3]) swap(t4,t3);
if(a[t3]>a[t2]) swap(t3,t2);
if(a[t2]>a[t1]) swap(t2,t1);
shu[j][1]=t1;
shu[j][2]=t2;
shu[j][3]=t3;
shu[j][4]=t4;
shu[j][5]=t5;
shu[j][6]=t6;
}
}
}
for(ll i=2;i<=n;i++)
{
for(ll j=2;j<=n;j++)
{
for(ll k=1;k<=4;k++)
{
for(ll f=1;f<=4;f++)
{
if(!shu[i][k]||!shu[j][f]) continue;
if(dist[i][j]>k) continue;
if(i!=j&&j!=shu[i][k]&&shu[i][k]!=shu[j][f]&&i!=shu[i][k]&&i!=shu[j][f]&&j!=shu[j][f])
{
ans=max(ans,a[i]+a[j]+a[shu[i][k]]+a[shu[j][f]]);
// cout<<shu[i][k]<<" "<<i<<" "<<" "<<j<<" "<<shu[j][f]<<" "<<ans<<"\n";
}
}
}
}
}
cout<<ans;
return 0;
}