C语言编码。用到邻接矩阵。一快递小哥要把快递送到所有客户手中,并在送完后返回。输入包括快递站在内的所有的城市数量,和总路线数量。输出快递小哥的经过的路径及走过的距离。
时间: 2024-02-05 07:12:26 浏览: 18
以下是一个基于邻接矩阵的C语言程序,可以解决这个问题:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_CITY_NUM 100
#define INF 0x3f3f3f3f
int dist[MAX_CITY_NUM][MAX_CITY_NUM]; // 邻接矩阵
int path[MAX_CITY_NUM][MAX_CITY_NUM]; // 记录路径
void floyd(int n) { // Floyd算法求最短路径
int i, j, k;
for (k = 0; k < n; k++) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (dist[i][j] > dist[i][k] + dist[k][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
path[i][j] = k; // 记录路径
}
}
}
}
}
void print_path(int i, int j) { // 输出路径
if (path[i][j] == -1) { // 直达
printf("%d -> %d\n", i + 1, j + 1);
} else { // 分成两段递归输出
int k = path[i][j];
print_path(i, k);
print_path(k, j);
}
}
int main() {
int n, m;
printf("请输入城市数量和路线数量:\n");
scanf("%d%d", &n, &m);
// 初始化邻接矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
dist[i][j] = 0;
} else {
dist[i][j] = INF;
}
path[i][j] = -1; // 初始路径记录为-1
}
}
// 输入路线信息
int u, v, w;
printf("请输入每条路线的起点、终点和长度:\n");
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &w);
dist[u - 1][v - 1] = w; // 注意下标是从0开始的
}
floyd(n); // 求最短路径
// 输出结果
printf("快递小哥的路径及走过的距离:\n");
int total_dist = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (dist[i][j] < INF) {
total_dist += dist[i][j];
printf("%d -> %d: %d\n", i + 1, j + 1, dist[i][j]);
print_path(i, j);
printf("\n");
}
}
}
printf("总距离:%d\n", total_dist);
return 0;
}
```
该程序使用了 Floyd 算法来求解最短路径,并且记录了每个点的前驱节点,最后使用递归的方式输出路径。注意,这里假设输入的城市编号是从1开始的,但实际上在程序中使用的下标是从0开始的,因此在输入时需要将编号减1。