旅行商问题用回溯法并且包含排列空间树思想并且用二维数组存储邻接矩阵表示所给的图解决,请给我具体C++实现代码
时间: 2024-02-24 22:59:37 浏览: 68
好的,以下是旅行商问题用回溯法并包含排列空间树思想的C++实现代码,同时使用二维数组存储邻接矩阵表示所给的图:
```
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 20;
int n, ans = INF;
int map[MAXN][MAXN];
bool vis[MAXN];
void dfs(int cur, int cost, int cnt) {
if (cnt == n && map[cur][0] != INF) {
ans = min(ans, cost + map[cur][0]);
return;
}
if (cost >= ans) return;
for (int i = 1; i <= n; i++) {
if (!vis[i] && map[cur][i] != INF) {
vis[i] = true;
dfs(i, cost + map[cur][i], cnt + 1);
vis[i] = false;
}
}
}
int main() {
memset(vis, false, sizeof(vis));
memset(map, INF, sizeof(map));
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j];
}
}
vis[0] = true;
for (int i = 1; i < n; i++) {
swap(map[0][i], map[i][0]);
}
for (int i = 1; i < n; i++) {
sort(map[i] + 1, map[i] + n);
}
dfs(0, 0, 0);
cout << ans << endl;
return 0;
}
```
注意,这里将起点固定为0,其它点与0交换位置,然后将每个点相邻的点按距离从小到大排序。同时,使用二维数组存储邻接矩阵表示所给的图。
阅读全文