按理来说暴力应该只会有TLE来着,求大佬看看哪里错了
#include<bits/stdc++.h>
using namespace std;
int n,m,k,g[2505][2505];
long long ans,val[2505];
bool ss[2505][2505];
void bfs(int s)
{
queue<int> q,qd;
q.push(s);
qd.push(0);
bool vis[2505];
memset(vis,0,sizeof(vis));
while(!q.empty())
{
int u=q.front(),dis=qd.front();
q.pop();
qd.pop();
if(vis[u]==true)
continue;
vis[u]=true;
g[s][u]=min(g[s][u],dis);
for(int i=1;i<=n;i++)
if(ss[u][i]==true)
{
q.push(i);
qd.push(dis+1);
}
}
}
void bbfs()
{
queue<int> q,qt;
queue<long long> qd;
for(int i=1;i<=n;i++)
if(g[1][i]<=k)
{
q.push(i);
qd.push(val[i]);
qt.push(1);
}
while(!q.empty())
{
int u=q.front(),t=qt.front();
long long w=qd.front();
q.pop();
qd.pop();
qt.pop();
if(t==5&&u!=1)
continue;
if(t==5&&u==1)
ans=max(ans,w);
for(int i=1;i<=n&&i!=u;i++)
if(g[u][i]<=k)
{
q.push(i);
qd.push(w+val[i]);
qt.push(t+1);
}
}
}
signed main()
{
scanf("%d%d%d",&n,&m,&k);
k++;
for(int i=2;i<=n;i++)
scanf("%lld",&val[i]);
memset(g,0x3f,sizeof(g));
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
ss[u][v]=ss[v][u]=true;
}
for(int i=1;i<=n;i++)
bfs(i);
bbfs();
printf("%lld",ans);
return 0;
}