- 算法说明
旅行商问题是NP难问题,这里给出蛮力法求解过程,从原始城市出发,经过每一个城市后,再回到原始城市,即对中间的城市进行排列组合,求出每一种情况的权值和,取最小值。这里的排列组合,用stl中next_permutation()实现 - 代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 4
#define min(a, b) (a) > (b) ? (b) : (a)
int main() {
int dis[maxn + 1][maxn + 1] = {
{0, 0, 0, 0, 0},
{0, 0, 2, 5, 7},
{0, 2, 0, 8, 3},
{0, 5, 8, 0, 1},
{0, 7, 3, 1, 0}
};
int a[maxn - 1];
for(int i = 0; i < maxn - 1; i++) {
a[i] = i + 2;
}
int mindis = 1 << 29;
do {
int mind = dis[1][a[0]];
for(int i = 1; i < maxn - 1; i++) {
mind += dis[a[i - 1]][a[i]];
}
mind += dis[a[maxn - 2]][1];
mindis = min(mindis, mind);
} while(next_permutation(a, a + maxn - 1));
printf("%d", mindis);
return 0;
}
- 运行结果