c语言地铁管理系统包含最短路径和换乘c语言代码
时间: 2023-08-05 19:09:02 浏览: 123
以下是一个简单的地铁管理系统的 C 语言代码,包含了最短路径和换乘的功能:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
#define INF 0x3f3f3f3f
int graph[MAX][MAX]; // 存储地铁线路图
int n; // 地铁站点数量
/*
Dijkstra算法求最短路径
参数:
start: 起点
end: 终点
path[]: 存储最短路径
返回值: 最短路径长度
*/
int dijkstra(int start, int end, int path[]) {
int dist[MAX]; // 存储起点到各点的最短距离
int visited[MAX]; // 存储该点是否已被访问
int pre[MAX]; // 存储最短路径上的前一个点
int i, j, k, min;
// 初始化
for (i = 1; i <= n; i++) {
dist[i] = graph[start][i];
visited[i] = 0; // 未被访问
if (dist[i] == INF)
pre[i] = -1; // 无法到达
else
pre[i] = start; // 起点到该点的前一个点为起点
}
dist[start] = 0;
visited[start] = 1;
// 计算最短路径
for (i = 2; i <= n; i++) {
min = INF;
for (j = 1; j <= n; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
k = j;
}
}
visited[k] = 1;
for (j = 1; j <= n; j++) {
if (!visited[j] && dist[k] + graph[k][j] < dist[j]) {
dist[j] = dist[k] + graph[k][j];
pre[j] = k;
}
}
}
// 构建最短路径
j = end;
i = 0;
while (j != start) {
path[i++] = j;
j = pre[j];
}
path[i] = start;
// 翻转路径
for (j = 0; j <= i / 2; j++) {
k = path[j];
path[j] = path[i - j];
path[i - j] = k;
}
return dist[end];
}
/*
换乘算法
参数:
start: 起点
end: 终点
path[]: 存储最短路径
返回值: 最短路径长度
*/
int transfer(int start, int end, int path[]) {
int i, j, k, min;
int dist[MAX]; // 存储起点到各点的最短距离
int visited[MAX]; // 存储该点是否已被访问
int pre[MAX]; // 存储最短路径上的前一个点
int line[MAX]; // 存储从起点到各点的最短路径所经过的线路
// 初始化
for (i = 1; i <= n; i++) {
dist[i] = graph[start][i];
visited[i] = 0; // 未被访问
if (dist[i] == INF)
pre[i] = -1; // 无法到达
else
pre[i] = start; // 起点到该点的前一个点为起点
line[i] = -1;
}
dist[start] = 0;
visited[start] = 1;
// 计算最短路径
for (i = 2; i <= n; i++) {
min = INF;
for (j = 1; j <= n; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
k = j;
}
}
visited[k] = 1;
for (j = 1; j <= n; j++) {
if (!visited[j] && dist[k] + graph[k][j] < dist[j]) {
dist[j] = dist[k] + graph[k][j];
pre[j] = k;
line[j] = graph[k][j]; // 记录经过的线路
} else if (!visited[j] && dist[k] + graph[k][j] == dist[j] && line[j] > 0) {
line[j] += graph[k][j]; // 更新线路权值
}
}
}
// 构建最短路径
j = end;
i = 0;
while (j != start) {
path[i++] = j;
j = pre[j];
}
path[i] = start;
// 翻转路径
for (j = 0; j <= i / 2; j++) {
k = path[j];
path[j] = path[i - j];
path[i - j] = k;
}
// 输出换乘信息
printf("从%s到%s的最短路线为:\n", start, end);
int curLine = -1;
for (i = 0; i < n - 1; i++) {
if (line[path[i + 1]] != line[path[i]]) {
printf("在%s站换乘%s线路\n", path[i], line[path[i + 1]]);
curLine = line[path[i + 1]];
}
}
printf("到达%s站\n", end);
return dist[end];
}
int main() {
// 读入地铁线路图
scanf("%d", &n);
memset(graph, INF, sizeof(graph));
int i, j, k, m;
for (i = 1; i <= n; i++) {
scanf("%d", &m);
for (j = 0; j < m; j++) {
scanf("%d", &k);
if (j > 0) {
graph[k][i] = graph[i][k] = 1; // 相邻站点距离为1
}
}
}
// 读入起点和终点
int start, end;
scanf("%d %d", &start, &end);
// 求最短路径
int path[MAX];
int dist = dijkstra(start, end, path);
// 输出结果
printf("从%s到%s的最短路线为:\n", start, end);
for (i = 0; i < n; i++) {
if (i == 0)
printf("%s", path[i]);
else
printf("->%s", path[i]);
}
printf("\n距离为%d\n", dist);
// 换乘
transfer(start, end, path);
return 0;
}
```
需要注意的是,这只是一个简单的示例代码,实际情况可能更加复杂,需要根据具体情况进行修改和完善。
阅读全文