样例对了,交上去爆0
查看原帖
样例对了,交上去爆0
196975
wangzihan_楼主2022/10/29 22:09

爆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);
	}
 } 
2022/10/29 22:09
加载中...