爆0求助 样例是对的
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define maxn 5005
#define LL long long
using namespace std;
int n,m,k;
LL mark[maxn];
LL ans=-1;
int a[maxn][maxn];
int b[maxn][maxn];
int v[maxn];
void dfs(int x,LL cnt,int p)
{
if(p>=5) return ;
if(p==4&&x==1)
{
ans=max(ans,cnt);
return ;
}
for(int i=1;i<=n;i++)
{
if(a[x][i]&&!v[i])
{
v[i]=1;
dfs(i,cnt+mark[i],p+1);
v[i]=0;
}
}
}
void dfs2(int chushi,int x,int p,int q)
{
if(p==q)
{
b[chushi][x]=b[x][chushi]=1;
return ;
}
for(int i=1;i<=n;i++)
{
if(a[x][i]&&!v[i])
{
v[i]=1;
dfs2(chushi,i,p+1,q);
}
}
}
int main()
{
//freopen("holiday.in","r",stdin);
//freopen("holiday.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<n;i++)
{
scanf("%d",&mark[i+1]);
}
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
a[x][y]=a[y][x]=1;
}
if(k==0)
{
dfs(1,0,0);
printf("%lld",ans);
}
else
{
for(int o=1;o<=n;o++)
{
v[o]=1;
for(int i=1;i<=k;i++)
{
dfs2(o,o,0,i+1);
memset(v,0,sizeof(v));
}
memset(v,0,sizeof(v));
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
if(b[i][j]) a[i][j]=b[i][j];
}
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}*/
dfs(1,0,0);
printf("%lld",ans);
}
}