#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int noEdge=65535;
class Traveling
{
public:
void BackTrack(int i);
int n;
int *x;
int *bestx;
int **a;
int cc;
int bestc;
};
void Traveling::BackTrack(int i)
{
if(i == n)
{
if(a[x[n-1]][x[n]] !=noEdge && a[x[n]][1] !=noEdge
&&(cc+a[x[n-1]][x[n]]+a[x[n]][1]<bestc || bestc ==noEdge))
{
for(int j=1;j<=n;j++)
{
bestx[j]=x[j];
}
bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1];
}
}
else
{
for(int j=i;j<=n;j++)
{
if(a[x[i-1]][x[j]] != noEdge && (cc+a[x[i-1]][x[j]]<bestc||bestc == noEdge))
{
swap(x[i],x[j]);
cc+=a[x[i-1]][x[i]];
BackTrack(i+1);
cc-=a[x[i-1]][x[i]];
swap(x[i],x[j]);
}
}
}
}
int TSP(int **a,int v[],int n)
{
Traveling Y;
Y.x = new int [n+1];
for(int i=1;i<=n;i++)
{
Y.x[i]=i;
}
Y.a= a;
Y.n= n;
Y.bestc = noEdge;
Y.bestx = v;
Y.cc = 0;
Y.BackTrack(2);
cout<<"旅行售货员问题的最优路径:";
for(int i=1;i<=n;i++)
{
cout<<Y.bestx[i]<<" ";
}
cout<<1<<endl;
delete []Y.x;
return Y.bestc;
}
int main()
{
int n;
cout<<"输入城市的个数";
cin>>n;
int **vector = new int *[n+1];
for(int i=1;i<=n;i++)
{
vector[i] = new int [n+1];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
vector[i][j]= noEdge;
}
}
int x;
cout<<"输入城市间存在的通路的个数";
cin>>x;
cout<<"输入数据的形式为:(1 2 3)"<<endl;
int index_i,index_j,value;
for(int i=0;i<x;i++)
{
cin>>index_i>>index_j>>value;
vector[index_i][index_j]=value;
vector[index_j][index_i]=value;
}
cout<<"输出临界矩阵"<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<setw(5)<<vector[i][j]<<" ";
}
cout<<endl;
}
int *v = new int [n+1];
cout<<"旅行售货员问题的最优值为:"<<TSP(vector,v,n)<<endl;
}
