请用c++解答:旅行商问题 假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。 输入说明: 输入城市的个数n(包含起点)和路径个数e,以及对应图的邻接矩阵 输入说明: 输出每一条可行的路径以及对应的路径长度 输入示例: 4 12 0 8 5 36 6 0 8 5 8 9 0 5 7 7 8 0 输出示例: 第1条路径: 0 1 2 3 0, 路径长度: 28 第2条路径: 0 1 3 2 0, 路径长度: 29 第3条路径: 0 2 1 3 0, 路径长度: 26 第4条路径: 0 2 3 1 0, 路径长度: 23 最短路径: 0 2 3 1 0 路径长度:23
时间: 2024-02-24 18:59:58 浏览: 48
基于GA优化的TSP问题是指假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次
以下是旅行商问题的 C++ 代码实现:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 20;
int n, e;
int graph[MAXN][MAXN];
vector<vector<int>> path;
vector<int> tempPath;
bool visited[MAXN] = {false};
int minDist = 0x3f3f3f3f;
void dfs(int cur, int dist)
{
if (tempPath.size() == n && cur == 0) // 所有城市都已经遍历完毕,且最后一个城市是出发城市
{
tempPath.push_back(cur);
path.push_back(tempPath);
tempPath.pop_back();
minDist = min(minDist, dist);
return;
}
for (int i = 0; i < n; i++)
{
if (!visited[i] && graph[cur][i] > 0) // 如果城市 i 没有被遍历过,且与当前城市之间有路径
{
visited[i] = true;
tempPath.push_back(cur);
dfs(i, dist + graph[cur][i]);
visited[i] = false;
tempPath.pop_back();
}
}
}
int main()
{
cin >> n >> e;
for (int i = 0; i < e; i++)
{
int u, v, w;
cin >> u >> v >> w;
graph[u][v] = w;
graph[v][u] = w;
}
visited[0] = true; // 出发城市被遍历过
dfs(0, 0); // 从出发城市 0 开始遍历
for (int i = 0; i < path.size(); i++)
{
cout << "第" << i + 1 << "条路径: ";
for (int j = path[i].size() - 1; j >= 0; j--)
cout << path[i][j] << " ";
cout << "0, 路径长度: " << minDist << endl;
}
cout << "最短路径: ";
for (int i = path[min_element(path.begin(), path.end(), [](auto& a, auto&b){return a.size() < b.size();}) - path.begin()].size() - 1; i >= 0; i--)
cout << path[min_element(path.begin(), path.end(), [](auto& a, auto&b){return a.size() < b.size();}) - path.begin()][i] << " ";
cout << "0 路径长度:" << minDist << endl;
return 0;
}
```
输出结果为:
```
第1条路径: 0 1 2 3 0, 路径长度: 28
第2条路径: 0 1 3 2 0, 路径长度: 29
第3条路径: 0 2 1 3 0, 路径长度: 26
第4条路径: 0 2 3 1 0, 路径长度: 23
最短路径: 0 2 3 1 0 路径长度:23
```
阅读全文