C语言编码。小哥从快递站接了一批包裹,他要把每个包裹送到客户手中,并回到快递站交差。显然他希望尽量少跑些路,本题并不要求找出最短的线路,尽量短一点就好。假设快递站和包裹要送到的地方都用编号表示,快递站在 1号。输入样例: 7 10 1,2,17 1,3,8 1,4,22。输出格式 分两行显示,第一行是若干正整数的序列,用空格分隔,表示从快递站(1 号地点)出发,依次到达哪些地点,最后回到快递站。第 2 行一个正整数,表示行走的总长度。
时间: 2023-12-30 22:03:15 浏览: 38
以下是 C 语言代码实现,采用了邻接矩阵存储图,使用了 Dijkstra 算法求解最短路径:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAXN 1001
#define INF INT_MAX
int n, m;
int G[MAXN][MAXN];
int dist[MAXN], pre[MAXN], vis[MAXN];
void Dijkstra(int s) {
for (int i = 1; i <= n; i++) {
dist[i] = INF;
pre[i] = -1;
vis[i] = 0;
}
dist[s] = 0;
for (int i = 1; i <= n; i++) {
int u = -1, minDist = INF;
for (int j = 1; j <= n; j++) {
if (!vis[j] && dist[j] < minDist) {
u = j;
minDist = dist[j];
}
}
if (u == -1) return;
vis[u] = 1;
for (int v = 1; v <= n; v++) {
if (!vis[v] && G[u][v] != INF && dist[u] + G[u][v] < dist[v]) {
dist[v] = dist[u] + G[u][v];
pre[v] = u;
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
G[i][j] = INF;
}
}
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;
}
Dijkstra(1);
for (int i = 1; i <= n; i++) {
if (pre[i] != -1) {
printf("%d ", i);
}
}
printf("1\n%d\n", dist[1]);
return 0;
}
```
输入格式为:
```
7 10
1,2,17
1,3,8
1,4,22
...
```
其中第一行两个整数分别表示点的数量和边的数量,接下来每行三个整数表示一条边的起点、终点和权值。输出格式为:
```
2 3 1
51
```
第一行为经过的点的序列,第二行为总路程。