#include<iostream>
#include<cstring>
using namespace std;
int a[100][100];//用来存储权值
int x[100]; //x[i]用来存储第i步遍历的城市
int isIn[100];//保存城市是否被加入路径
int bestw=100000,cw=0,n;
int i,j,k;
int bestx[100];
void Travel_Backtrack(int t)//用i的话太容易混淆路
{
if(t>n){
if(cw<bestw){
for(i=1;i<=n;i++) bestx[i]=x[i];//这个数组的存在是有必要的
bestw=cw;
}
return;
}
else{
for(k=1;k<=n;i++){
if(a[x[t-1]][k]!=-1 && !isIn[k]){//没有被加入到路径中去
isIn[k]=1;
x[t]=k;
cw+=a[x[t-1]][k];
Travel_Backtrack(t+1);
isIn[k]=0;
x[t]=0;
cw-=a[x[t-1]][k];
}
}
}
}
int main(void)
{
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
//选择了第一步
x[1]=1;isIn[1]=1;
Travel_Backtrack(2);
cout<<bestw<<endl;
for(i=1;i<=n;i++) cout<<bestx[i]<<endl;
}
还不是一个完整版的实现
用回溯法解旅行员收获问题
最新推荐文章于 2023-06-26 15:53:02 发布