C语言编码。小哥从快递站接了一批包裹,他要把每个包裹送到客户手中,并回到快递站交差。显然他希望尽量少跑些路,本题并不要求找出最短的线路,尽量短一点就好。假设快递站和包裹要送到的地方都用编号表示,快递站在 1号,某些地点之间有道路相连,道路的长度已知。请为小哥设计一个送包裹的线路。比如:小哥接单的包裹要送往 6 个地点,各个地点之间是否有道路相通、以及路程长度如下图所示。 10 20 输入格式 输入的第 1 行是两个整数,前一个数表示 n 的值,是包括出快递站在内的地点的数量后一个表示 m,即共有多少条道路。从第 2 行开始,每一行是3个正整数,用逗号分隔,形如“x,yz”,表示两个地点之间道路长度,x 和y是地点编号,z 是长度。所有道路信息按首个地点x升序排列,x 相同者再按排序。
时间: 2023-11-21 13:04:33 浏览: 58
C语言输入一个整数序列并计算他们的值.rar_C语言输入一个整数序列并计算他们的值_输入序列C语言
5星 · 资源好评率100%
这道题可以使用 Dijkstra 算法来解决,下面是 C 语言的实现:
```c
#include <stdio.h>
#include <limits.h>
#define N 1005
int n, m;
int graph[N][N];
int dist[N];
int visited[N];
void dijkstra(int start) {
// 初始化距离和访问数组
for (int i = 1; i <= n; i++) {
dist[i] = INT_MAX;
visited[i] = 0;
}
dist[start] = 0;
// 执行 n 次循环,每次找出一个最短路径
for (int i = 1; i <= n; i++) {
// 找出当前未访问节点中距离最小的节点
int minDist = INT_MAX;
int minIndex = -1;
for (int j = 1; j <= n; j++) {
if (!visited[j] && dist[j] < minDist) {
minDist = dist[j];
minIndex = j;
}
}
if (minIndex == -1) {
break;
}
visited[minIndex] = 1;
// 更新 minIndex 的邻接节点的距离
for (int j = 1; j <= n; j++) {
if (graph[minIndex][j] != -1) {
int newDist = dist[minIndex] + graph[minIndex][j];
if (newDist < dist[j]) {
dist[j] = newDist;
}
}
}
}
}
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 = 1; i <= m; i++) {
int a, b, c;
scanf("%d,%d,%d", &a, &b, &c);
graph[a][b] = graph[b][a] = c;
}
// 执行 Dijkstra 算法
dijkstra(1);
// 输出结果
printf("%d\n", dist[n]);
return 0;
}
```
在这个实现中,我们使用了一个邻接矩阵来表示图,其中 `graph[i][j]` 表示节点 i 和节点 j 之间的距离,如果它们之间没有边相连,则距离为 -1。
在 `dijkstra` 函数中,我们首先初始化距离数组和访问数组,然后执行 n 次循环,每次找出一个最短路径。在每次循环中,我们找出当前未访问节点中距离最小的节点,将它标记为已访问,并更新它的邻接节点的距离。最终,距离数组中的值就是从起点到各个节点的最短距离。
最后,我们输出距离数组中第 n 个元素的值,即从起点到终点的最短距离。
阅读全文