C语言编写程序,描述:一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知。给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间的最短路径。 输入:多组数据,每组数据有m+3行。第一行为两个整数n和m,分别代表城市个数n和路径条数m。第二行有n个字符,代表每个城市的名字。第三行到第m+2行每行有两个字符a和b和一个整数d,代表从城市a到城市b有一条距离为d的路。最后一行为两个字符,代表待求最短路径的城市起点和终点。当n和m都等于0时,输入结束。 输出:每组数据输出两行。第一行为一个整数,为从起点到终点之间最短路的长度。第二行为一串字符串,代表该路径。每两个字符之间用空格隔开。
时间: 2024-02-01 11:13:29 浏览: 142
以下是C语言程序实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1000 // 最大城市数
#define INF 0x3f3f3f3f // 无穷大
int n, m; // 城市个数和路径条数
char city[MAXN][3]; // 城市名
int g[MAXN][MAXN]; // 图的邻接矩阵
int dist[MAXN]; // 起点到各点的最短距离
int prev[MAXN]; // 最短路径中当前节点的前驱节点
int vis[MAXN]; // 标记是否已确定最短路
int getIndex(char name[]) { // 根据城市名获取在city数组中的下标
int i;
for (i = 0; i < n; i++) {
if (strcmp(name, city[i]) == 0) {
return i;
}
}
return -1; // 没找到
}
void dijkstra(int start, int end) {
int i, j, k, min;
memset(vis, 0, sizeof(vis)); // 初始化
for (i = 0; i < n; i++) {
dist[i] = g[start][i];
prev[i] = (dist[i] == INF ? -1 : start); // 如果起点到i不连通,prev[i]为-1
}
dist[start] = 0;
vis[start] = 1;
for (i = 1; i < n; i++) { // 循环n-1次
min = INF;
for (j = 0; j < n; j++) { // 找未确定最短路的距离最小的节点
if (!vis[j] && dist[j] < min) {
min = dist[j];
k = j;
}
}
vis[k] = 1;
for (j = 0; j < n; j++) { // 更新起点到未确定最短路的节点的距离
if (!vis[j] && dist[k] + g[k][j] < dist[j]) {
dist[j] = dist[k] + g[k][j];
prev[j] = k;
}
}
}
// 输出
printf("%d\n", dist[end]);
if (dist[end] == INF) { // 不连通
printf("no path\n");
} else {
int path[MAXN], cnt = 0;
path[cnt++] = end;
while (prev[path[cnt - 1]] != start) {
path[cnt++] = prev[path[cnt - 1]];
}
path[cnt++] = start;
for (i = cnt - 1; i >= 0; i--) {
printf("%s ", city[path[i]]);
}
printf("\n");
}
}
int main() {
int i, j, d;
char start[3], end[3];
while (scanf("%d%d", &n, &m) == 2 && n) {
// 初始化
memset(g, INF, sizeof(g));
for (i = 0; i < n; i++) {
scanf("%s", city[i]);
}
for (i = 0; i < m; i++) {
char a[3], b[3];
scanf("%s%s%d", a, b, &d);
int x = getIndex(a), y = getIndex(b);
g[x][y] = d;
}
scanf("%s%s", start, end);
dijkstra(getIndex(start), getIndex(end));
}
return 0;
}
```
程序中用邻接矩阵存储图,使用Dijkstra算法求解最短路径。每次循环找未确定最短路的距离最小的节点,并更新起点到未确定最短路的节点的距离和前驱节点。最后根据prev数组输出最短路径。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)