C语言编码。小哥从快递站接了一批包裹,他要把每个包裹送到客户手中,并回到快递站交差。显然他希望尽量少跑些路,本题并不要求找出最短的线路,尽量短一点就好。假设快递站和包裹要送到的地方都用编号表示,快递站在 1号,某些地点之间有道路相连,道路的长度已知。请为小哥设计一个送包裹的线路。比如:小哥接单的包裹要送往 6 个地点,各个地点之间是否有道路相通、以及路程长度如下图所示。 10 20 输入格式 输入的第 1 行是两个整数,前一个数表示 n 的值,是包括出快递站在内的地点的数量后一个表示 m,即共有多少条道路。从第 2 行开始,每一行是3个正整数,用逗号分隔,形如“x,yz”,表示两个地点之间道路长度,x 和y是地点编号,z 是长度。所有道路信息按首个地点x升序排列,x 相同者再按排序。写注释
时间: 2023-11-21 15:04:33 浏览: 96
```
#include <stdio.h>
#include <string.h>
#define MAX 1010 //定义数组最大长度
int main()
{
int n, m;
int i, j, k;
int map[MAX][MAX]; //二维数组表示地图
int dis[MAX]; //记录每个地点到快递站的距离
int book[MAX]; //标记每个地点是否已经访问过
int sum = 0; //记录总路程
scanf("%d%d", &n, &m);
memset(map, 999999, sizeof(map)); //初始化地图,即初始距离为极大值
for (i = 1; i <= n; i++)
map[i][i] = 0; //自己到自己的距离为0
//输入各个地点之间道路的长度
for (i = 1; i <= m; i++)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
map[a][b] = c;
}
//初始化dis数组,表示每个地点到快递站的距离,初始值为快递站到自己的距离
for (i = 1; i <= n; i++)
dis[i] = map[1][i];
//初始化book数组,表示每个地点是否已经访问过,初始值都为0
memset(book, 0, sizeof(book));
book[1] = 1; //快递站已经访问过
//进行n-1次循环,每次找出一个距离快递站最近的地点,并将它标记为已访问
for (i = 1; i <= n - 1; i++)
{
int min = 999999, u;
for (j = 1; j <= n; j++)
{
if (book[j] == 0 && dis[j] < min)
{
min = dis[j];
u = j;
}
}
book[u] = 1; //标记为已访问
//更新dis数组,即更新每个地点到快递站的距离
for (k = 1; k <= n; k++)
{
if (book[k] == 0 && dis[k] > dis[u] + map[u][k])
{
dis[k] = dis[u] + map[u][k];
}
}
}
//计算总路程
for (i = 2; i <= n; i++)
sum += dis[i];
printf("%d\n", sum);
return 0;
}
```
阅读全文