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);
}
}
}
自己测试的数据发现有很多问题。
- dfs函数中参数过多,参杂进去全局变量了
- 数据初始化的问题。
- 数组下标是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);
}
}
}
再次纪念我第一次写出来这样的代码,同时也给我很多启发。