写一段c++代码解决这个问题,【问题描述】 给定n个城市(从0到n-1),3元组[A, B, C]表示城市A和城市B之间存在道路,且成本为C。计算从0号城市出发,旅行完每个城市一遍,最后回到0号城市的最小成本与路径。如果不存
时间: 2023-07-31 15:04:28 浏览: 99
一个用C++写的求最短路径的代码
5星 · 资源好评率100%
在这样的路径,则返回-1。
以下是一份使用Dijkstra算法解决该问题的C++代码示例:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <climits>
using namespace std;
const int MAXN = 105;
const int INF = INT_MAX;
struct Edge {
int to, cost;
Edge(int t, int c) : to(t), cost(c) {}
};
vector<Edge> graph[MAXN];
int dist[MAXN][1 << 15];
priority_queue<pair<int, pair<int, int> >, vector<pair<int, pair<int, int> > >, greater<pair<int, pair<int, int> > > > pq;
int tsp(int n) {
memset(dist, 0x3f, sizeof(dist));
dist[0][1] = 0;
pq.push(make_pair(0, make_pair(0, 1)));
while (!pq.empty()) {
auto cur = pq.top();
pq.pop();
int d = cur.first;
int v = cur.second.first;
int s = cur.second.second;
if (dist[v][s] < d) {
continue;
}
for (auto& e : graph[v]) {
int nv = e.to;
int ns = s | (1 << nv);
if (dist[nv][ns] > dist[v][s] + e.cost) {
dist[nv][ns] = dist[v][s] + e.cost;
pq.push(make_pair(dist[nv][ns], make_pair(nv, ns)));
}
}
}
int ans = INF;
for (int i = 1; i < n; i++) {
ans = min(ans, dist[i][(1 << n) - 1] + graph[i][0].cost);
}
if (ans == INF) {
return -1;
} else {
return ans;
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
graph[a].emplace_back(b, c);
graph[b].emplace_back(a, c);
}
cout << tsp(n) << endl;
return 0;
}
```
该代码使用了Dijkstra算法来计算从0号城市出发经过所有城市一遍后回到0号城市的最小成本。其中,dist[i][j]表示当前在第i个城市,已经经过的城市集合为j的情况下到达i城市的最小成本。在每一次迭代中,我们枚举当前所在城市v以及已经经过的城市集合s,然后尝试从v出发到达其他城市,并更新dist数组。最后,我们在所有已经经过所有城市集合的情况下,从每个城市i返回0号城市的成本中取一个最小值就是答案。
需要注意的一点是,我们将s表示为一个二进制数,其中第i位为1表示已经经过了第i个城市。这样可以方便地进行状态转移和更新。
阅读全文