用c语言实现程序,根据一张旅游路线图,已知城市之间的路线长度以及花费的费用。请编写程序输出一条从出发地到目的地之间的最短规划路线。如果存在若干条最短路径,则输出费用最少的一条路线以及沿途经过的城市,给出代码和注释
时间: 2024-03-25 12:38:08 浏览: 78
这个问题需要使用Dijkstra算法来解决,下面是使用C语言实现的代码和注释:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_CITY_NUM 100 // 城市数量的最大值
#define MAX_ROUTE_NUM 1000 // 路线数量的最大值
// 定义边的结构体,包含起点、终点、路线长度和花费
typedef struct {
int from; // 起点
int to; // 终点
int length; // 路线长度
int cost; // 路线花费
} Route;
// 定义城市的结构体,包含城市名称和到起点的距离
typedef struct {
char name[20]; // 城市名称
int distance; // 到起点的距离
} City;
City cities[MAX_CITY_NUM]; // 存储所有城市
int cityNum; // 城市数量
Route routes[MAX_ROUTE_NUM]; // 存储所有路线
int routeNum; // 路线数量
// Dijkstra算法,用于求解从起点到目的地的最短规划路线
void dijkstra(int start, int end) {
int visited[MAX_CITY_NUM] = {0}; // 用于标记城市是否被访问过
int distance[MAX_CITY_NUM]; // 存储起点到每个城市的距离
int cost[MAX_CITY_NUM]; // 存储起点到每个城市的花费
int prev[MAX_CITY_NUM]; // 存储每个城市的前驱节点
int city; // 当前正在访问的城市
int i, j, min;
// 初始化距离、花费和前驱节点
for (i = 0; i < cityNum; i++) {
distance[i] = INT_MAX;
cost[i] = INT_MAX;
prev[i] = -1;
}
// 将起点的距离和花费都设置为0
distance[start] = 0;
cost[start] = 0;
// 开始循环访问所有城市
for (i = 0; i < cityNum; i++) {
// 找到未被访问过的距离最小的城市
min = INT_MAX;
for (j = 0; j < cityNum; j++) {
if (!visited[j] && distance[j] < min) {
min = distance[j];
city = j;
}
}
// 标记该城市已被访问
visited[city] = 1;
// 更新与该城市相邻的城市的距离和花费
for (j = 0; j < routeNum; j++) {
if (routes[j].from == city) {
if (distance[city] + routes[j].length < distance[routes[j].to]) {
distance[routes[j].to] = distance[city] + routes[j].length;
cost[routes[j].to] = cost[city] + routes[j].cost;
prev[routes[j].to] = city;
} else if (distance[city] + routes[j].length == distance[routes[j].to] && cost[city] + routes[j].cost < cost[routes[j].to]) {
cost[routes[j].to] = cost[city] + routes[j].cost;
prev[routes[j].to] = city;
}
}
}
}
// 输出最短规划路线
printf("最短规划路线为:\n");
printf("%s", cities[end].name);
for (i = prev[end]; i != -1; i = prev[i]) {
printf(" -> %s", cities[i].name);
}
printf("\n");
printf("该路线的长度为:%d\n", distance[end]);
printf("该路线的费用为:%d\n", cost[end]);
}
int main() {
int i, start, end;
// 输入城市数量和路线数量
printf("请输入城市数量和路线数量:\n");
scanf("%d %d", &cityNum, &routeNum);
// 输入每个城市的名称
printf("请输入每个城市的名称:\n");
for (i = 0; i < cityNum; i++) {
scanf("%s", cities[i].name);
}
// 输入每条路线的信息
printf("请输入每条路线的信息(起点 终点 路线长度 路线费用):\n");
for (i = 0; i < routeNum; i++) {
scanf("%d %d %d %d", &routes[i].from, &routes[i].to, &routes[i].length, &routes[i].cost);
}
// 输入起点和目的地
printf("请输入起点和目的地的编号(从1开始):\n");
scanf("%d %d", &start, &end);
// 调用Dijkstra算法求解最短规划路线
dijkstra(start - 1, end - 1);
return 0;
}
```
注释中已经解释了每段代码的作用,具体实现流程如下:
1. 定义边和城市的结构体,以及存储所有城市和路线的数组。
2. 实现Dijkstra算法,用于求解从起点到目的地的最短规划路线。
3. 在主函数中,首先输入城市数量和路线数量,以及每个城市的名称和每条路线的信息。
4. 接着输入起点和目的地的编号,调用Dijkstra算法求解最短规划路线,并输出结果。
需要注意的是,输入的城市编号应该从1开始,而不是从0开始。
阅读全文