代码
#include <iostream>
#include <cstdlib>
using namespace std;
#define N 100
int n; //表示城市个数
int a[N + 1][N + 1];
int x[N];
int bestx[N];
int bestc = -1; //最右路径长度;
int cc = 0; //当前路径的长度
void Backtrcak(int i)
{
if (i > n) // 当到达叶子结点时
{
//当最后一个城市和出发城市之间有路且当前路径与长度最后一个城市到出发城市之间的长度之和小于最优解时,表明得到了新的最优解和最优值,更新最优解和最优值
if (a[x[n]][x[1]] > 0 && (cc + a[x[n]][x[1]] < bestc || bestc == -1))
{
bestc = cc + a[x[n]][x[1]]; //更新最优值
for (int j = 1; j <= n; j++) //更新最优解
bestx[j] = x[j];
}
}
else //当没有到达叶子结点时
{
for (int j = i; j <= n; j++) //采用全排列方式
{
//当当前城市和前一个城市之间有路且当前路径长度和当前城市和前一个城市之间的路径长度之和小于最优解,说明还有可能产生最优解和最优值,继续搜索,不满足条件则不可能有新的最优值,则剪枝剪去即可
if (a[x[i - 1]][x[j]] > 0 && (cc + a[x[i - 1]][x[j]] < bestc || bestc == -1))
{
swap(x[i], x[j]);
cc += a[x[i - 1]][x[i]];
Backtrcak(i + 1);
cc -= a[x[i - 1]][x[i]];
swap(x[i], x[j]);
}
}
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
for (int i = 1; i <= n; i++)
x[i] = i;
Backtrcak(2);
cout << bestc << endl;
for (int i = 1; i <= n; i++)
cout << bestx[i] << " ";
system("pause");
return 0;
}