代码如下
#include<iostream>
#include<cmath>
#include<cstdio>
#include<map>
#include<algorithm>
#include<vector>
#define inf 1234567890
#define maxn 1005
#define ll long long
using namespace std;
ll n,m,k,s,a[maxn][maxn],ans,goal[maxn];
vector<int> ma[maxn];
inline int read(){
int f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x*f;
}
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
if(a[i][k]==inf||k==i){
continue;
}
for(int j=1;j<=n;j++){
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
if(a[i][j]>k){
a[i][j]=inf;
}
}
}
}
}
void dfs(int tp,int x,ll tot){
if(x==0){
if(tp==1){
ans=max(ans,tot);
return ;
}
}
for(int i=0;i<ma[tp].size();i++){
if(x>1){
if(ma[tp][i]>tp){
dfs(ma[tp][i],x-1,tot+goal[ma[tp][i]]);
}
}
else{
if(ma[tp][i]==1){
dfs(ma[tp][i],x-1,tot);
}
else{
return ;
}
}
}
return ;
}
int main(){
n=read();m=read();k=read();
k++;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=inf;
}
}
goal[1]=0;
for(int i=2;i<=n;i++){
goal[i]=read();
}
for(int i=1,u,v;i<=m;i++){
u=read();v=read();
a[u][v]=1;
a[v][u]=1;
}
floyd();
for(int i=1;i<=n;i++){
if(a[i][1]<=k){
ma[i].push_back(1);
}
for(int j=i+1;j<=n;j++){
if(a[i][j]<=k){
ma[i].push_back(j);
}
}
}
dfs(1,5,0);
cout<<ans<<endl;
return 0;
}
姑且不论TLE和RE,为什么第三个样例比标准输出少1