c++实现【问题描述】 给定n个城市(从0到n-1),3元组[A, B, C]表示城市A和城市B之间存在道路,且成本为C。计算从0号城市出发,旅行完每个城市一遍,最后回到0号城市的最小成本与路径。如果不存在最优方案,输出-1. 【输入形式】 第一行有两个数n、m表示n个城市,m条边。 接下来的m行均为空格隔开的三个整数A B C,表示城市A和B之间的成本为C 【输出形式】 最小成本 最小成本对应的路径
时间: 2023-11-28 22:50:08 浏览: 76
一个用C++写的求最短路径的代码
5星 · 资源好评率100%
以下是C++实现的代码,使用了TSP问题的动态规划解法:
```c++
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 20, INF = 0x3f3f3f3f;
int n, m, g[N][N], f[1 << N][N];
vector<int> path;
int main() {
cin >> n >> m;
memset(g, 0x3f, sizeof g);
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
g[a][b] = g[b][a] = min(g[a][b], c);
}
memset(f, 0x3f, sizeof f);
f[1][0] = 0;
for (int i = 1; i < 1 << n; i += 2) { // 枚举子集,从0开始必须是奇数
for (int j = 0; j < n; j++) {
if (i >> j & 1) {
for (int k = 0; k < n; k++) {
if (i - (1 << j) == 1 && k == 0) continue; // 特判只有0一个节点的情况
if (i >> k & 1) {
f[i][j] = min(f[i][j], f[i - (1 << j)][k] + g[k][j]);
}
}
}
}
}
int res = INF, end = 0;
for (int i = 1; i < n; i++) { // 枚举最后一个节点
if (f[(1 << n) - 1][i] == INF) continue;
if (res > f[(1 << n) - 1][i] + g[i][0]) {
res = f[(1 << n) - 1][i] + g[i][0];
end = i;
}
}
if (res == INF) cout << -1 << endl;
else {
path.push_back(0);
int state = (1 << n) - 1 - (1 << end);
int u = end;
while (state) { // 逆推路径
for (int i = 0; i < n; i++) {
if (state >> i & 1 && f[state][u] == f[state - (1 << i)][i] + g[i][u]) {
path.push_back(i);
state -= 1 << i;
u = i;
break;
}
}
}
path.push_back(end);
cout << res << endl;
for (int i = path.size() - 1; i >= 0; i--) {
cout << path[i] << " ";
}
}
return 0;
}
```
该代码的时间复杂度为 $O(n^22^n)$,对于较小的数据集可以通过,但对于较大的数据集则无法承受。因此,需要使用其他算法来解决该问题,比如遗传算法、模拟退火等启发式算法或者使用最优化算法来解决。
阅读全文