/*旅行售货员问题回溯法*/
#include<stdio.h>
#define N 4
int cc,//当前路径费用
bestc;//当前最优解费用
int a[N+1][N+1];//邻接矩阵,存放图的信息
int bestx[N+1];//当前最优解
int x[N+1];//当前解
void inputAjac()
{
int i,j;
printf("输入大于0的值表示有边,小于0表示无边:\n");
for(i=1;i<=N;i++)
{
for(j=i+1;j<=N;j++)
{
printf("请输入第%d个城市到第%d个城市所需路费为:",i,j);
scanf("%d",&a[i][j]);
a[j][i]=a[i][j];
}
}
}
void backtrack(int i)
{
if(i==N)
{
if(a[x[N-1]][x[N]]>0&&a[x[N]][x[1]]>0)
{
if(bestc<0||bestc>cc+a[x[N-1]][x[N]]+a[x[N]][x[1]])
{
int j;
for(j=1;j<=N;j++)
{
bestx[j]=x[j];
bestc=cc+a[x[N-1]][x[N]]+a[x[N]][x[1]];
}
}
}
}
else
{
int j;
for(j=i;j<=N;j++)
{
if(a[x[i-1]][x[j]]>0)
{
if(bestc<0||bestc>cc+a[x[i-1]][x[j]]+a[x[j]][x[1]])
{
int temp;
cc+=a[x[i-1]][x[j]];
temp=x[i];
x[i]=x[j];
x[j]=temp;
backtrack(i+1);
temp=x[i];
x[i]=x[j];
x[j]=temp;
cc-=a[x[i-1]][x[j]];
}
}
}
}
}
int tsp()
{
//初始化
int i;
for(i=1;i<=N;i++)
{
x[i]=i;
}
cc=0,bestc=-1;
inputAjac();
backtrack(2);
return bestc;
}
void output()
{
int i;
for(i=1;i<=N;i++)
{
printf("%4d",bestx[i]);
}
printf("%4d",bestx[1]);
printf("\n");
}
void main()
{
printf("走%d个城市最少路费为:%d",N,tsp());
printf("\n");
printf("走法为:");
output();
}