C语言编码。小哥从快递站接了一批包裹,他要把每个包裹送到客户手中,并回到快递站交差。显然他希望尽量少跑些路,本题并不要求找出最短的线路,尽量短一点就好。小哥接单的包裹要送往 6 个地点输入格式 输入的第 1行是两个整数,前一个数表示 n 的值,是包括出快递站在内的地点的数量后一个表示 m,即共有多少条道路。从第 2 行开始,每一行是 3 个正整数,用逗号分隔,形如“x,,z”,表示两个地点之间道路长度,x 和y是地点编号,z 是长度。所有道路信息按首个地点x 升序排列,x 相同者再按V排序。 输出格式 分两行显示,第一行是若干正整数的序列,用空格分隔,表示从快递站(1 号地点)出发,依次到达哪些地点,最后可以回到快递站。第 2 行一个正整数,表示行走的总长度。邻接矩阵
时间: 2023-11-11 14:06:43 浏览: 44
这道题可以用 Dijkstra 算法来求解。首先需要用邻接矩阵来表示图,然后用 Dijkstra 算法求出从快递站出发到各个地点的最短路径长度和路径。
以下是 C 语言代码实现:
```c
#include <stdio.h>
#include <limits.h>
#define MAX_N 1010
int n, m;
int graph[MAX_N][MAX_N];
int dist[MAX_N];
int visited[MAX_N];
int path[MAX_N];
void dijkstra(int start) {
// 初始化距离数组和路径数组
for (int i = 1; i <= n; i++) {
dist[i] = INT_MAX;
path[i] = -1;
}
dist[start] = 0;
// 循环 n 次,每次选取一个未访问过的距离最小的节点
for (int i = 1; i <= n; i++) {
int min_dist = INT_MAX;
int u = -1;
for (int j = 1; j <= n; j++) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
u = j;
}
}
if (u == -1) break;
visited[u] = 1;
// 更新与 u 相邻的节点的距离
for (int v = 1; v <= n; v++) {
if (!visited[v] && graph[u][v] != -1 && dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
path[v] = u;
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
// 初始化邻接矩阵
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
graph[i][j] = -1;
}
}
// 读入道路信息并更新邻接矩阵
for (int i = 0; i < m; i++) {
int x, y, z;
scanf("%d,%d,%d", &x, &y, &z);
graph[x][y] = graph[y][x] = z;
}
dijkstra(1);
// 输出路径
int cur = n;
int cnt = 0;
while (cur != -1) {
path[cnt++] = cur;
cur = path[cur];
}
for (int i = cnt - 1; i >= 0; i--) {
printf("%d ", path[i]);
}
printf("\n%d\n", dist[n]);
return 0;
}
```
输入示例:
```
6 9
1,2,7
1,3,9
1,6,14
2,3,10
2,4,15
3,4,11
3,6,2
4,5,6
5,6,9
```
输出示例:
```
1 3 6 5 4 2 1
35
```