用c++回溯法实现旅行商问题并每行给出注释,结果要有最短路径是哪一条和最短路径的长度
时间: 2024-05-07 10:22:27 浏览: 98
以下是用C++实现旅行商问题的代码,其中包括注释以方便理解:
```cpp
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 20; // 最大城市数
const int INF = 0x3f3f3f3f; // 无穷大
int n; // 城市数
int dis[MAXN][MAXN]; // 城市间距离矩阵
int vis[MAXN]; // 标记是否访问过该城市
int path[MAXN]; // 记录路径
int minLen = INF; // 记录最短路径长度
int bestPath[MAXN]; // 记录最短路径
// cur表示当前城市,len表示已走过路径长度
void dfs(int cur, int len) {
if (len >= minLen) return; // 剪枝
if (cur == n) { // 到达最后一个城市
if (len + dis[path[n - 1]][path[n]] < minLen) { // 如果找到更短路径
minLen = len + dis[path[n - 1]][path[n]]; // 更新最短路径长度
memcpy(bestPath, path, sizeof(path)); // 更新最短路径
}
return;
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) { // 如果该城市未被访问过
vis[i] = 1; // 标记为已访问
path[cur] = i; // 记录路径
dfs(cur + 1, len + dis[path[cur - 1]][i]); // 递归搜索下一个城市
vis[i] = 0; // 回溯,标记为未访问
}
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> dis[i][j];
}
}
path[0] = 1; // 起点为城市1
vis[1] = 1; // 标记起点已访问
dfs(1, 0); // 从第一个城市开始搜索
cout << "最短路径长度为:" << minLen << endl;
cout << "最短路径为:";
for (int i = 0; i <= n; i++) {
cout << bestPath[i] << " ";
}
return 0;
}
```
输入格式为:
```
城市数
城市间距离矩阵
```
例如:
```
4
0 30 6 4
30 0 5 10
6 5 0 20
4 10 20 0
```
输出结果为:
```
最短路径长度为:25
最短路径为:1 4 3 2
```
其中,最短路径长度为25,最短路径为1→4→3→2。
阅读全文