数据结构-最短地铁乘坐线路

  1. 问题描述

某市修建了两条地铁线路。公司为方便乘客乘车,现需要开发一个地铁乘坐指南的小应用软件,该应用软件的其中一个功能是计算出最短地铁乘坐线路的站数。

2.功能描述

该市的2条地铁线路如图所示,其中A为环线,B为东西向线路,线路都是双向的两条线交叉的换乘点用T1、T2表示

地铁线A(环线)经过车站:A1→A2→A3→A4→A5→A6→A7→A8→A9→T1→ A10→A11→A12→A13→T2A14→A15→A16→A17→A18。

 

地铁线B(直线)经过车站:Bl→B2→B3→B4→B5→T1→B6→B7→B8→B9→B10→ T2→B1l→B12→B13→B14→B15。

【无向图】

用户重新输入 举例如下

输入:

A3 B7

输出:

站数为10

线路为A3→A4→A5→A6→A7→A9→T1→B6→B7

3.设计思路

本项目中A9与A10,A13与A14,B5与 B6,B10与B11不连续,中间有相交点,另有上下两个环,这是设计的难点。本项目要计算出地铁换乘最短的路径,使用图的最短路径广度优先算法即可。

用纯c语言写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是地铁路线问题的BFS算法C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_STATION 100 // 最大站点数 #define MAX_LINE 10 // 最大地铁线路数 #define INF 0x3f3f3f3f // 无穷大 int graph[MAX_STATION][MAX_STATION]; // 存储地铁线路图 int line[MAX_STATION][MAX_STATION]; // 存储站点所属地铁线路 int dis[MAX_STATION]; // 存储起点到各个站点的最短距离 int pre[MAX_STATION]; // 存储最短路径上各个站点的前驱节点 bool vis[MAX_STATION]; // 存储各个站点是否已访问 int n, m; // 站点数,地铁线路数 void bfs(int s, int t) { for (int i = 1; i <= n; i++) { dis[i] = INF; pre[i] = -1; vis[i] = false; } dis[s] = 0; vis[s] = true; int queue[MAX_STATION], front = 0, rear = 0; queue[rear++] = s; while (front < rear) { int u = queue[front++]; for (int v = 1; v <= n; v++) { if (graph[u][v] && !vis[v]) { dis[v] = dis[u] + 1; pre[v] = u; vis[v] = true; queue[rear++] = v; if (v == t) { return; } } } } } void print_path(int s, int t) { if (pre[t] == -1) { printf("不存在路径\n"); return; } int path[MAX_STATION], top = 0; for (int u = t; u != s; u = pre[u]) { path[top++] = u; } path[top++] = s; printf("最短路径为:"); for (int i = top - 1; i >= 0; i--) { printf("%d", path[i]); if (i > 0) { printf(" -> "); } } printf("\n"); } int main() { printf("请输入站点数和地铁线路数:"); scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { printf("请输入第%d条地铁线路的站点数:", i + 1); int k; scanf("%d", &k); int last, cur; scanf("%d", &last); for (int j = 1; j < k; j++) { scanf("%d", &cur); graph[last][cur] = graph[cur][last] = 1; line[last][cur] = line[cur][last] = i + 1; last = cur; } } printf("请输入起点和终点:"); int s, t; scanf("%d%d", &s, &t); bfs(s, t); printf("起点到各个站点的最短距离:\n"); for (int i = 1; i <= n; i++) { printf("%d ", dis[i]); } printf("\n"); print_path(s, t); return 0; } ``` 注意,该代码中的地铁线路图是无向图,每个站点之间距离为1,即任意两个站点之间的距离都为1,因为这里只考虑了站点之间的直接连接,而没有考虑地铁线路的运行方向和经过时间等因素。如果需要考虑这些因素,需要对代码进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值