C语言编码。小哥从快递站接了一批包裹,他要把每个包裹送到客户手中,并回到快递站交差。显然他希望尽量少跑些路,本题并不要求找出最短的线路,尽量短一点就好。假设快递站和包裹要送到的地方都用编号表示,快递站在 1号。输入样例: 7 10 1,2,17 1,3,8 1,4,22。输出格式 分两行显示,第一行是若干正整数的序列,用空格分隔,表示从快递站(1 号地点)出发,依次到达哪些地点,最后回到快递站。第 2 行一个正整数,表示行走的总长度。
时间: 2023-12-30 20:03:23 浏览: 77
c代码-C语言三个数从小到大排序/输出: 任意输入 3 个整数,编程实现对这 3 个整数由小到大进行排序。 冒泡排序的动画 https://haokan.baidu.com/v?vid=8080732080990475789&pd=bjh&fr=bjhauthor&type=video
以下是C语言代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1001
#define INF 0x3f3f3f3f
int graph[MAXN][MAXN];
int visited[MAXN];
int path[MAXN];
int n, m;
int dijkstra() {
int dist[MAXN];
for (int i = 1; i <= n; i++) {
dist[i] = INF;
visited[i] = 0;
path[i] = -1;
}
dist[1] = 0;
visited[1] = 1;
int cur = 1;
int cnt = 1;
while (cnt < n) {
for (int i = 1; i <= n; i++) {
if (visited[i] == 0 && graph[cur][i] != -1) {
if (dist[cur] + graph[cur][i] < dist[i]) {
dist[i] = dist[cur] + graph[cur][i];
path[i] = cur;
}
}
}
int min_dist = INF;
for (int i = 1; i <= n; i++) {
if (visited[i] == 0 && dist[i] < min_dist) {
cur = i;
min_dist = dist[i];
}
}
visited[cur] = 1;
cnt++;
}
return dist[1];
}
void print_path() {
int p = 1;
int len = 0;
while (p != -1) {
printf("%d ", p);
if (path[p] != -1) {
len += graph[p][path[p]];
}
p = path[p];
}
printf("\n%d\n", len);
}
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;
}
}
int x, y, z;
for (int i = 1; i <= m; i++) {
scanf("%d,%d,%d", &x, &y, &z);
graph[x][y] = z;
}
for (int i = 1; i <= n; i++) {
if (graph[1][i] != -1) {
continue;
}
graph[1][i] = INF;
}
for (int i = 1; i <= n; i++) {
if (i != 1 && graph[i][1] == -1) {
graph[i][1] = INF;
}
}
int len = dijkstra();
print_path();
return 0;
}
```
解析:
首先需要注意的是,这是一个无向图,所以需要将输入的边(x,y)同时在邻接矩阵中标记出来,即graph[x][y]=graph[y][x]=z。
其次,由于题目要求从1号节点出发,最后回到1号节点,所以需要对1号节点到其他节点和其他节点到1号节点这两个方向上没有边的点增加一条权重为无穷大的边,表示不能通过这个点到达。
最后,使用Dijkstra算法求解最短路径,并记录路径。路径记录可以通过一个数组path来实现,path[i]表示从起点到i节点的最短路径上i节点的前一个节点。
阅读全文