P8817 [CSP-S 2022] 假期计划 IDA*做法,求调
  • 板块学术版
  • 楼主naturelyf
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/17 19:39
  • 上次更新2024/10/17 21:14:41
查看原帖
P8817 [CSP-S 2022] 假期计划 IDA*做法,求调
476473
naturelyf楼主2024/10/17 19:39
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e3+10;
vector<int> edge[N];
int ma[N][N];
int n,m,k;
int va[N];
int a,b;
int ans=0;
int sg[N];
void dfs1(int p,int u,int dep){
	if(dep==0)return;
	for(int v:edge[u]){
		if(!sg[v]){
			ma[p][v]=true;
			sg[v]=true;
			dfs1(p,v,dep-1);
		}
	}
}
int f[N];
void dfs2(int u,int res,int dep){
	if(dep==0){
		f[u]=max(res,f[u]);
		return;
	}
	for(int v=1;v<=n;v++){
		if(!sg[v]&&ma[u][v]){
			sg[v]=true;
			dfs2(v,res+va[v],dep-1);
			sg[v]=false;
		}
	}
}
void dfs3(int u,int res,int dep){
	if(dep==3)
		if(res+f[u]<ans)
			return;
	if(dep==1){
		if(ma[1][u])ans=max(ans,res);
		return;
	}
	for(int v=1;v<=n;v++){
		if(!sg[v]&&ma[u][v]){
			sg[v]=true;
			dfs3(v,res+va[v],dep-1);
			sg[v]=false;
		}
	}
}
signed main(){
	freopen("holiday.in","r",stdin);
//	freopen("holiday.out","w",stdout);
	scanf("%lld%lld%lld",&n,&m,&k);
	for(int i=2;i<=n;i++)scanf("%lld",&va[i]);
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&a,&b);
		edge[a].push_back(b),edge[b].push_back(a);
	}
	for(int i=1;i<=n;i++)ma[i][i]=1;
	for(int i=1;i<=n;i++){
		memset(sg,0,sizeof sg);
		sg[i]=true;
		dfs1(i,i,k+1);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<ma[i][j]<<" ";
		}
		puts("");
	}
	memset(sg,0,sizeof sg);
	sg[1]=true;
	dfs2(1,0ll,2);
//	for(int i=1;i<=n;i++)
//		cout<<f[i]<<" ";
//	puts("");
	memset(sg,0,sizeof sg);
	sg[1]=true;
	dfs3(1,0ll,5);
	cout<<ans;
	return 0;
}

dfs1建图,邻接矩阵,dfs2预处理估值函数,估值函数f[x]表示从1走到x走两步最多拿多少分,dfs3就是暴力找,当找到第三步的时候调用估值函数看看要不要继续搜索。官方90,冥间总共WA5个,求调

2024/10/17 19:39
加载中...