2021-01-07

UVA140的剪枝部分

第一次的代码:

void dfs(int cur,int b_low,int ans){
	if(cur++==n){
		if(ans<b_low)b_low=ans;
		return;
	}
	for(int i=0;i<n;i++){
		int ok=1;
		for(int j=0;j<cur;i++)if(S[j]==i){ok=0;break;}
		if(ok){
			S[cur]=i;pos[S[cur]]=cur;
			if(n-cur>b_low)continue; 
			for(int j=0;j<cur;j++)
				for(int k=0;k<G[j].size();k++)ans=max(ans,abs(pos[j]-pos[G[j][k]]));
			if(ans>b_low)continue;
			dfs(cur+1,b_low,ans);
		}
	}
}

自己测试的数据发现有很多问题。

  1. dfs函数中参数过多,参杂进去全局变量了
  2. 数据初始化的问题。
  3. 数组下标是0和1的问题

在实际操作过程中,我一步步改程序,最终得到了可以过样例的版本,实际上还没有对此代码进行最终测试。

vector<int> G[maxn]; 
int n,E;int kans;
int S[maxn];int pos[maxn];int maxP[maxn];
int k_ans;
void dfs(int cur,int ans){
	if(cur==n){
		if(ans<k_ans){
			k_ans=ans;
			memcpy(maxP,S,sizeof(S));
		}
		return;
	}
	for(int i=1;i<=n;i++){
		int ok=1;
		for(int j=0;j<cur;j++)if(S[j]==i){ok=0;break;}
		//cout<<ok;
		if(ok){
			S[cur]=i;pos[S[cur]]=cur;
			if(n-cur-1>k_ans)continue; 
			ans=0;
			for(int j=0;j<cur;j++)
				for(int k=0;k<G[j].size();k++)ans=max(ans,abs(pos[j]-pos[G[j][k]]));
			if(ans>k_ans)continue;
			dfs(cur+1,ans);
		}
	}
}

再次纪念我第一次写出来这样的代码,同时也给我很多启发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值