今天本来要处理的是八皇后问题,突然间想实现一下旅行售货员问题,于是我的第一版代码如下(没有带任何的剪枝函数),其中旅行售货员的图是王晓东-计算机算法设计与分析140页图:
#include<iostream>
using namespace std;
int visit[4];
int road[4]; //记录的是路径
int sum = 0;
int cost = 200;
int flag = 0;
int dfs(int n);
int a[4][4] = {
{0,30,6,4},
{30,0,5,10},
{6,5,0,20},
{4,10,20,0}
};
int main(){
// memset(visit,0,4*sizeof(int));
dfs(0);
printf("%d",cost);
}
int dfs(int n){
if((visit[0]+visit[1]+visit[2]+visit[3]) == 4&& n==0){ //其中我感觉有两个地方挺重要的,一个是这里的条件:要求所有的节点都要访问到,并且最最后访问的一定是节点1
if (cost > sum)
cost = sum;
if (sum==25){
for (int j=0; j<4; j++){
cout << road[j]+1 << " ";
}
cout << endl;
}
return 0;
}
for (int i=0; i<4; i++){
if (a[n][i]!=0 && visit[i]==0){
visit[i] = 1;
road[flag++] = i;
sum += a[n][i];
dfs(i);
road[--flag] = 0; // 当回溯的时间一定要将全局变量回复原来的状态(下面两行都是这个作用)
visit[i] = 0;
sum -= a[n][i];
}
}
}
带上剪枝函数后:
书中代码实现: