暴搜0分求助!!!
查看原帖
暴搜0分求助!!!
576111
Frederick123楼主2022/11/7 16:41

#1~#14 RE

#15~#20 TLE

#include<stdio.h>
#include<string.h>
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b

typedef long long ll;
const ll INF=9223372036854775807;
const int N=2512;
inline ll read();
inline int write(ll);
ll res,a[N];
int n,m,k,f[N][N];
bool vis[N];
ll ans1[N],ans2[N];
int dfs(int step,ll ans,int now)
{
	if(step==2)//折半处理 
	{
		if(ans1[now]<ans)ans1[now]=ans;
		else
		if(ans2[now]<ans)ans2[now]=ans;
		//if(f[now][1]<=k)
		//res=max(res,ans);
		return 0;
	}
	for(ll i=2;i<=n;i++)
	{
		if(!vis[i]&&f[now][i]<=k&&now!=i)
		{
			vis[i]=1;
			dfs(step+1,ans+a[i],i);
			vis[i]=0;
		}
	}
}
int main()
{
	memset(f,0x3f,sizeof(f));
	n=read();
	m=read();
	k=read();
	for(int i=2;i<=n;i++)
	a[i]=read();
	for(int i=1;i<=n;i++)
	f[i][i]=0;
	for(int i=1;i<=m;i++)
	{
		ll x=read();
		ll y=read();
		f[x][y]=1;
		f[y][x]=1;
	}
	for(int q=1;q<=n;q++)
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	f[i][j]=min(f[i][j],f[i][q]+f[q][j]);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	f[i][j]--;
	dfs(0,0,1);
	for(int i=1;i<=n;i++)
	res=max(res,ans1[i]+ans2[i]);
	write(res);
	return 0;
}
inline ll read()
{
	char ch=getchar();
	ll x=0,f=1;
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
inline int write(ll x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
	return 0;
}
2022/11/7 16:41
加载中...