至少交了10遍了,为了测试还交过题解
真的服了,再这样下去我会像lty一样疯狂嗯造二锅头死了。
#include<bits/stdc++.h>
using namespace std;
long long n,m,k,tot,x,y,f[2505][2505],s[2505],h[2505],c[2505][11],ans;
vector<long long>v;
struct node
{
long long v,nxt;
}a[300005];
void add(long long x,long long y)
{
tot++;
a[tot].v=y;
a[tot].nxt=h[x];
h[x]=tot;
}
queue<long long>q;
void bfs(long long x)
{
f[x][x]=0;
while(!q.empty())q.pop();
q.push(x);
while(!q.empty())
{
long long t=q.front();
q.pop();
for(int i=h[t];i;i=a[i].nxt)
if(f[x][a[i].v]>f[x][t]+1)
{
f[x][a[i].v]=f[x][t]+1;
if(f[x][a[i].v]<=k)q.push(a[i].v);
}
}
}
bool cmp(long long x,long long y)
{
return s[x]>s[y];
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
k++;
memset(f,127,sizeof(f));
for(int i=2;i<=n;i++)scanf("%lld",&s[i]);
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&x,&y);
add(y,x),add(x,y);
}
for(int i=1;i<=n;i++)bfs(i);
for(int i=2;i<=n;i++)
{
v.clear();
for(int j=2;j<=n;j++)
{
if(i==j)continue;
if(f[1][j]<=k&&f[j][i]<=k)v.push_back(j);
}
sort(v.begin(),v.end(),cmp);
for(int j:v)
{
c[i][++c[i][0]]=j;
if(c[i][0]>=3)break;
}
}
for(int i=2;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(f[i][j]>k)continue;
for(int u:c[i])
{
if(!u)break;
for(int v:c[j])
{
if(!v)break;
if(u!=v&&v!=i&&u!=j)ans=max(ans,s[i]+s[j]+s[u]+s[v]);
}
}
}
printf("%lld",ans);
return 0;
}