//用数组C[n][n]存放n个城市间的费用值。
//用数组P[n]记录已经找到的费用最小的周游路线,C为其相应的费用, C初值为∞。
//用数组N[n]记录目前正在寻找的周游路线,NC为其相应的费用;
//如果结点next不是N中已有的结点,且NC+C[N[s]][next]小于C,则结点next是可接受的。
//如果NC+C[N[n]][1]小于C,则路线N更佳,于是P[] = N[],C = NC+C[N[n]][1]。
#include<iostream>
using namespace std;
const int MAX = 100;
int P[MAX],N[MAX],T[MAX];
int Cost,NCost;
void back_try(int s,int n,int C[4][4])
{
for(int i = 1; i<n; i++)
if(NCost+C[N[s]][i]<Cost && !T[i])
{
P[s] = i; //记录
NCost = NCost+C[N[s]][i];
T[i] = 1;
N[s+1] = i;
if(s == n-2)
{
if(NCost+C[N[i]][1]<Cost) //选新的路径
{
for(int j=0; j<n; j++)
P[j] = N[j];
Cost = NCost + C[N[n]][1];
}
}
else
back_try(s+1,n,C);
//去掉记录
NCost = NCost - C[N[s]][i];
T[i] = 0;
N[s+1] = 0;
}
}
void TSP(int n, int C[4][4])
{//初始化
for(int i = 0; i<n; i++)
{
P[i] = 0;
N[i] = 0;
T[MAX] = 0;
}
Cost = 10000;
NCost = 0;
back_try(0,n,C);
cout<<"找到最小开销路径:"<<endl;
for(int j = 0; j<4; j++)
cout<<"->"<<P[j];
cout<<endl;
cout<<endl<<"最小开销为:"<<endl<<Cost<<endl;
}
int main()
{
int city[4][4] ={{0,3,6,7},
{5,0,2,3},
{6,4,0,2},
{3,7,5,0}};
TSP(4,city);
system("pause");
return 0;
}