某销售员要到n个城市去推销商品,已知各城市之间的路程(或旅费)s。售货员选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使得总的路程(或总旅费)最小。设G=(V,E)是一个带权图。图中的各边的费用(权)为正数。图中的一条周游路线是包括V中的每个顶点在内的一条回路。周游路线的费用是这条路线上所有边的费用之和。旅行售货员问题是指在图G中找出费用最小的周游路线。如果找不到可行方案,则输出-1。 输入 第一行城市的数量n。 接下来每行输入各城市之间的路程(旅费)。(假设起点即驻地为1号顶点) 输出 第一行最短路程(或最少旅费) 第二行最短路程(或费用最小)的周游路线 样例输入 Copy 4 1 2 30 1 3 6 1 4 4 2 3 5 2 4 10 3 4 20 样例输出 Copy 25 1 3 2 4 1 用C语言编写,用回溯法实现
时间: 2023-11-22 17:55:43 浏览: 139
回溯法不是求解最短路径的常用方法。最短路径问题通常使用 Dijkstra 算法、Bellman-Ford 算法或 Floyd 算法等。这里给出 Floyd 算法的 C 语言实现。
```c
#include <stdio.h>
#define MAXN 100
#define INF 0x3f3f3f3f
int n, m;
int dist[MAXN][MAXN]; // dist[i][j]表示从i到j的最短距离
void floyd() {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (dist[i][k] != INF && dist[k][j] != INF && dist[i][j] > dist[i][k] + dist[k][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
}
int main() {
scanf("%d", &n);
m = n * (n - 1) / 2; // 边数为完全图的边数
// 初始化距离矩阵
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
dist[i][j] = 0;
} else {
dist[i][j] = INF;
}
}
}
// 输入边权
int u, v, w;
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &w);
dist[u][v] = w;
dist[v][u] = w; // 无向图,要反向赋值
}
floyd(); // Floyd 算法求解最短路径
// 计算最小路径和
int minDist = INF;
for (int i = 1; i <= n; i++) {
int curDist = 0;
for (int j = 1; j <= n; j++) {
curDist += dist[i][j];
}
if (curDist < minDist) {
minDist = curDist;
}
}
printf("%d\n", minDist);
// 求解最短路径
int path[MAXN];
int vis[MAXN] = {0};
int cur = 1;
path[0] = 1;
vis[1] = 1;
for (int i = 1; i < n; i++) {
int next;
int minDist = INF;
for (int j = 1; j <= n; j++) {
if (!vis[j] && dist[cur][j] < minDist) {
next = j;
minDist = dist[cur][j];
}
}
path[i] = next;
vis[next] = 1;
cur = next;
}
path[n] = 1; // 回到起点
for (int i = 0; i <= n; i++) {
printf("%d ", path[i]);
}
return 0;
}
```
以上代码使用 Floyd 算法求解最短路径,时间复杂度为 O(n^3)。求解最小路径和和最短路径均使用简单的遍历方式,时间复杂度为 O(n^2)。
阅读全文
相关推荐
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![cpp](https://img-home.csdnimg.cn/images/20250102104920.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)