思路看书
#include <iostream>
using namespace std;
// 城市数量
#define N 4
// 课本例题
int dis[N][N] = {{0, 3, 6, 7},
{5, 0, 2, 3},
{6, 4, 0, 2},
{3, 7, 5, 0}};
// int dis[N][N] = {
// {0, 10, 15, 20},
// {10, 0, 35, 25},
// {15, 35, 0, 30},
// {20, 25, 30, 0}};
// #define N 5
// int dis[N][N] = {{0, 3, 6, 7, 8},
// {5, 0, 2, 3, 8},
// {6, 4, 0, 2, 8},
// {3, 7, 5, 0, 8},
// {8, 8, 8, 8, 0}};
int x[N]; // 记录当前路径
int cur_dis; // 记录当前路径的总距离
int bestroad[N]; // 记录最优路径
int bestdis; // 记录最优距离
void printx() // 打印函数,输出当前路径
{
for (int i = 0; i < N; i++)
cout << x[i] << " ";
cout << endl;
}
void TSP(int t)
{
if (t == N - 1)
{ // 判断边界,不能到不了,要比当前最优解短
if (dis[x[N - 2]][x[N - 1]] != 0 && dis[x[N - 1]][0] != 0 && (cur_dis + dis[x[N - 2]][x[N - 1]] + dis[x[N - 1]][0] < bestdis || bestdis == 0))
{ // 更新最优路径,最优距离
for (int i = 0; i < N; i++)
bestroad[i] = x[i];
bestdis = cur_dis + dis[x[N - 2]][x[N - 1]] + dis[x[N - 1]][0];
return;
}
}
else
{
for (int i = t; i < N; i++)
{
if (cur_dis + dis[x[t - 1]][x[t]] + dis[x[t]][0] < bestdis || bestdis == 0)
{ // x[t-i] -> x[t] ->0
swap(x[t], x[i]);
// printx();//输出当前路径
cur_dis += dis[x[t - 1]][x[t]];
TSP(t + 1);
// 回溯
cur_dis -= dis[x[t - 1]][x[t]];
swap(x[t], x[i]);
}
}
}
}
int main()
{
for (int i = 0; i < N; i++)
x[i] = i;
TSP(1); // 从1开始
cout << "最佳路径为:";
for (int i = 0; i < N; i++)
cout << bestroad[i] << " --> ";
cout << 0 << endl;
cout << "最短距离为:" << bestdis;
system("pause");
return 0;
}