C语言编码。用到邻接矩阵。小哥从快递站接了一批包裹,他要把每个包裹送到客户手中,并回到快递站交差。显然他希望尽量少跑些路,本题并不要求找出最短的线路,尽量短一点就好。快递站在 1号,某些地点之间有道路相连,道路的长度已知。请为小哥设计一个送包裹的线路。输入格式 输入的第 1行是两个整数,前一个数表示 n 的值,是包括出快递站在内的地点的数量后一个表示 m,即共有多少条道路。从第 2 行开始,每一行是 3 个正整数,用逗号分隔,形如“x,y,z”,表示两个地点之间道路长度,x 和y是地点编号,z 是长度。 输出格式 分两行显示,第一行是若干正整数的序列,用空格分隔,表示从快递站(1 号地点)出发,依次到达所有地点,最后也可以回到快递站。第 2 行一个正整数,表示从快递站出发到返回快递站的总长度。
时间: 2023-11-11 14:06:43 浏览: 67
以下是 C 语言代码实现,使用邻接矩阵存储图,采用深度优先搜索求解:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1005 // 最大顶点数
int n, m; // 地点数量,道路数量
int g[MAXN][MAXN]; // 邻接矩阵表示图
int vis[MAXN]; // 标记数组,标记是否已经走过
int path[MAXN]; // 存储路径
int min_len = 1e9; // 最小路径长度
void dfs(int u, int len, int cnt) {
// u 为当前所在地点编号,len 为当前路径长度,cnt 为已经走过的地点数量
if (cnt == n) { // 如果已经走过所有地点
if (len + g[u][1] < min_len) { // 如果回到快递站的路径更短
min_len = len + g[u][1]; // 更新最小路径长度
for (int i = 1; i <= n; i++) {
printf("%d ", path[i]); // 输出路径
}
printf("%d\n", 1);
}
return;
}
for (int v = 2; v <= n; v++) { // 枚举下一个要走的地点
if (!vis[v]) { // 如果这个地点还没走过
vis[v] = 1; // 标记为已经走过
path[cnt+1] = v; // 将这个地点加入路径中
dfs(v, len+g[u][v], cnt+1); // 继续搜索
vis[v] = 0; // 回溯,标记为未走过
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
g[i][j] = 1e9; // 初始化邻接矩阵,赋初值为一个很大的数
}
g[i][i] = 0; // 自己到自己的距离为 0
}
for (int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d,%d,%d", &u, &v, &w);
g[u][v] = g[v][u] = w; // 无向图,要赋值两次
}
vis[1] = 1; // 快递站已经走过
path[1] = 1; // 将快递站加入路径中
dfs(1, 0, 1); // 从快递站开始搜索
printf("%d\n", min_len); // 输出最短路径长度
return 0;
}
```
输入样例:
```
4 6
1,2,3
1,3,2
1,4,5
2,3,4
2,4,1
3,4,4
```
输出样例:
```
1 3 2 4 1
14
```
阅读全文