rt 代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#define PII pair<int,int>
#define mp make_pair
#define int long long
using namespace std;
typedef long long ll;
const int N=5e3+5;
const int M=2e4+5;
const int T=1e7+5;
const int INF=1e18;
struct Edge{
int v,w,next;
}edge[M];
struct Weight{
int ans,u,v;
}res[T];
int n,m,k,tot=0,amt=0,ans=-INF;
int head[M],val[M],g[N][N];
inline void add(int u,int v,int w){
edge[++tot]=(Edge){v,w,head[u]},head[u]=tot;
}
inline int read(){
int s=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-'){f=-1;} ch=getchar();}
while (isdigit(ch)) {s=(s<<1)+(s<<3)+ch-'0'; ch=getchar();}
return s*f;
}
inline void dijkstra(int s)
{
int d[N],vis[N];
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
queue <int> q;d[s]=0;q.push(s);
while (!q.empty())
{
int u=q.front();q.pop();
if (vis[u]) continue;
vis[u]=true;
for (int i=head[u];i;i=edge[i].next)
{
int v=edge[i].v,w=edge[i].w;
if (d[v]>d[u]+w)
{
d[v]=d[u]+w;
q.push(v);
}
}
}
for (int i=1;i<=n;i++)
g[s][i]=d[i];
}
inline bool comp(Weight x,Weight y){
return x.ans>y.ans;
}
signed main()
{
freopen("holiday.in","r",stdin);
freopen("holiday.out","w",stdout);
n=read(),m=read(),k=read();
for (int i=2;i<=n;i++) val[i]=read();
for (int i=1;i<=m;i++)
{
int u=read(),v=read();
add(u,v,1),add(v,u,1);
}
for (int i=1;i<=n;i++) dijkstra(i);
for (int i=2;i<=n;i++)
{
int u=i;
if (g[1][u]>k+1) continue;
for (int j=2;j<=n;j++)
{
if (j==u) continue;
int v=j;
if (g[u][v]>k+1) continue;
res[++amt]=(Weight){val[u]+val[v],u,v};
}
}
sort(res+1,res+1+amt,comp);
int l=0,r=0;
while (l<=amt)
{
l++;
while (r<=amt)
{
r++;
if (res[l].u==res[r].u || res[l].u==res[r].v) continue;
if (res[l].v==res[r].u || res[l].v==res[r].v) continue;
if (g[res[l].v][res[r].v]<=k+1)
{
int tmp=res[l].ans+res[r].ans;
ans=max(ans,tmp);
}
}
}
printf("%lld",ans);
fclose(stdin);
fclose(stdout);
return 0;
}