#include <iostream>
#include <climits>
using namespace std;
#define N 25
int d[N][N];
int x[N],best[N];
int cc,n;
int bestc=INT_MAX;
int sum;
void backtrack(int t)
{
if(t>n) //到叶子节点
{
if(d[x[n]][x[1]] > 0 && cc+d[x[n]][x[1]] < bestc || bestc==0) //推销员到的最后一个城市与出发的城市之间有路径,且当前总距离比当前最优值小
{
bestc=cc+d[x[n]][x[1]];
sum++;
for(int j=1; j<=n; j++)
best[j]=x[j];
cout<<“更新最优解:”<<endl;
for(int j=1; j<=n; j++)
cout<<best[j]<<” “;
cout<<best[1];
cout<<“距离为:”<<bestc<<endl;
}
}
else
{
for(int i=t;i<=n;i++) //搜索扩展结点的左右分支,即所有与当前所在城市临近的城市
{
if(d[x[t-1]][x[i]] > 0 && cc + d[x[t-1]][x[i]] < bestc || bestc==0) //若果第t-1个城市与第t个城市之间有路径且可以得到更短的路线
{
swap(x[t],x[i]);
cc+=d[x[t-1]][x[t]];
cout<<“当前状态:”<<endl;
for(int j=1; j<t; j++)
cout<<x[j]<<” “;
cout<<“距离为:”<<cc<<endl;
backtrack(t+1);
cc-=d[x[t-1]][x[t]];
swap(x[t],x[i]);
}
else{
swap(x[t],x[i]);
cc+=d[x[t-1]][x[t]];
cout<<“当前状态:”<<endl;
for(int j=1; j<=t; j++)
cout<<x[j]<<” “;
cout<<“距离为:”<<cc<<“剪枝”<<endl;
cc-=d[x[t-1]][x[t]];
swap(x[t],x[i]);
}
}
}
}
int main()
{
int i,j;
cout<<“输入节点数”<<“\n”;
while(cin>>n)
{
sum=0;
/* FILE* f = fopen(“table.csv”,”r”);
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++)
fscanf(f,”%d,”,d[i][j]);
fscanf(f,”\n”);
}*/
cout<<“输入邻接矩阵”<<“\n”;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>d[i][j];
cout<<“\n从1出发”<<“\n”;
for(i=1;i<=n;i++)
x[i]=i;
backtrack(2);
cout<<“\n从2出发”<<“\n”<<“\n”;
x[1]=2;x[2]=1;x[3]=3;x[4]=4;
backtrack(2);
cout<<“\n从3出发”<<“\n”<<“\n”;
x[1]=3;x[2]=1;x[3]=2;x[4]=4;
backtrack(2);
cout<<“\n从4出发”<<“\n”<<“\n”;
x[1]=4;x[2]=1;x[3]=2;x[4]=3;
backtrack(2);
if(sum==0)
cout<<“No Solution”<<endl;
else{
cout<<“\n最终最优解为:”<<endl;
for(int j=1; j<=n; j++)
cout<<best[j]<<” “;
cout<<best[1];
cout<<“距离为:”<<bestc<<endl;
}
}
return 0;
}