用c++解决邮递员问题。输入的第1行是两个整数,前一个数表示n的值,是包括出快递站在内的地点的数量,后一个表示m,即共有多少条道路。从第2行开始,每一行是3个正整数,用逗号分隔,每一行的前两个整数表示地点编号,后一个整数表示两个这两个地点之间的长度。每个地点编号可以重复经过。输出格式分两行显示,第一行依次输出所经过的地点位置,第2行一个正整数,表示行走的总长度
时间: 2023-12-30 19:04:37 浏览: 75
chinese-postman-problem:中国邮递员问题的C ++解决方案
以下是使用C++解决邮递员问题的代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f; // 定义一个极大值
struct Edge {
int from, to, dist;
Edge(int u, int v, int d) : from(u), to(v), dist(d) {}
};
struct Graph {
int n; // 节点数
vector<Edge> edges; // 边列表
Graph(int n) : n(n) {}
void addEdge(int from, int to, int dist) {
edges.push_back(Edge(from, to, dist));
edges.push_back(Edge(to, from, dist));
}
// Floyd算法求最短路,返回行走的总长度
int floyd() {
vector<vector<int>> d(n, vector<int>(n, INF));
vector<vector<int>> path(n, vector<int>(n, -1));
for (int i = 0; i < edges.size(); i++) {
int u = edges[i].from, v = edges[i].to, w = edges[i].dist;
d[u][v] = min(d[u][v], w);
path[u][v] = v;
d[v][u] = min(d[v][u], w);
path[v][u] = u;
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (d[i][j] > d[i][k] + d[k][j]) {
d[i][j] = d[i][k] + d[k][j];
path[i][j] = path[i][k];
}
}
}
}
// 输出路径
int cur = 0, sum = 0;
while (cur != n - 1) {
cout << cur << " ";
cur = path[cur][n - 1];
sum += d[cur][n - 1];
}
cout << n - 1 << endl;
return sum;
}
};
int main() {
int n, m;
cin >> n >> m;
Graph g(n);
for (int i = 0; i < m; i++) {
int u, v, w;
char c;
cin >> u >> c >> v >> c >> w;
g.addEdge(u, v, w);
}
int sum = g.floyd();
cout << sum << endl;
return 0;
}
```
这个算法的基本思路是使用 Floyd 算法求解所有点对之间的最短路,然后按照最短路路径输出经过的地点位置,并计算行走的总长度。
阅读全文