用c++解决邮递员问题,输入的第1行是两个整数,前一个数表示n的值,是包括出快递站在内的地点的数量,后一个表示m,即共有多少条道路。从第2行开始,每一行是3个正整数,用逗号分隔,形如“x,y,z”,表示两个地点之间道路长度,x和y是地点编号,z是长度。所有道路信息按首个地点x升序排列,x相同者再按y排序。输出格式分两行显示,第一行是若干正整数的序列,用空格分隔,表示从快递站(1号地点)出发,依次到达哪些地点,最后回到快递站。第2行一个正整数,表示行走的总长度
时间: 2023-09-18 13:13:01 浏览: 190
以下是解决邮递员问题的C++代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
const int MAXN = 205;
const int INF = 0x3f3f3f3f;
int n, m;
int g[MAXN][MAXN];
int dist[MAXN][1 << 16];
int path[MAXN][1 << 16];
std::vector<int> ans;
void tsp(int u, int state) {
if (state == (1 << n) - 1) {
ans.push_back(1);
return;
}
for (int v = 1; v <= n; v++) {
if (g[u][v] != INF && !(state & (1 << v - 1))) {
int new_state = state | (1 << v - 1);
if (dist[v][new_state] > dist[u][state] + g[u][v]) {
dist[v][new_state] = dist[u][state] + g[u][v];
path[v][new_state] = u;
tsp(v, new_state);
}
}
}
}
int main() {
std::cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
g[i][j] = 0;
} else {
g[i][j] = INF;
}
}
}
for (int i = 1; i <= m; i++) {
int u, v, w;
char c;
std::cin >> u >> c >> v >> c >> w;
g[u][v] = g[v][u] = w;
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
g[i][j] = std::min(g[i][j], g[i][k] + g[k][j]);
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < (1 << n); j++) {
dist[i][j] = INF;
}
}
dist[1][1] = 0;
tsp(1, 1);
std::reverse(ans.begin(), ans.end());
for (int i : ans) {
std::cout << i << " ";
}
std::cout << "1" << std::endl;
std::cout << dist[1][(1 << n) - 1] << std::endl;
return 0;
}
```
该代码通过 Floyd 算法求出任意两点之间的最短路径,然后使用状态压缩的 TSP 算法求解从起点出发的最短哈密顿回路。在 TSP 算法中,使用 dist[i][j] 表示从起点出发,已经遍历了状态 j ,当前在点 i 的最短距离;使用 path[i][j] 记录状态 j 中到达 i 的前一个点,以便输出路径。
阅读全文