news 2026/4/18 2:23:12

公交路线——全量遍历的路线BFS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
公交路线——全量遍历的路线BFS

需要解决的问题是:给定多条公交路线(每条路线包含若干站点),以及起点和终点站点,求从起点到终点最少需要乘坐的公交线路数量(换乘次数 = 线路数 - 1)。

1.直接遍历站点会因站点数量庞大导致效率低下 2.需保证找到 “最少换乘” 的最优解,而非任意可行解。

代码采用广度优先搜索 而非站点级遍历,核心逻辑是:
将 “公交线路” 作为图的节点,“两条线路有公共站点” 作为节点间的边(可换乘);
从包含起点的所有线路出发,逐层遍历可换乘的线路;
一旦遍历到包含终点的线路,立即返回当前乘坐的线路数(保证最少);
全程记录路径,确保能追溯具体换乘顺序。

核心是把公交线路抽象为图的节点、线路间有公共站点抽象为可换乘的边,通过层序遍历保证找到最少换乘的最优解。代码首先初始化一个存储自定义QueueNode结构体的队列,结构体包含当前换乘路径(line_path)和已乘坐线路数(path_amount),同时用visited数组标记已入队的线路避免重复处理;接着将所有包含起点的线路作为 BFS 初始层入队,设置初始线路数为 1、路径仅含该线路。随后进入队列循环,每次取出队首节点,获取当前路径的最后一条线路,遍历所有未访问线路,通过has_common_stop判断是否可换乘,若可换乘则检查目标线路是否包含终点,若包含则拼接路径并返回当前线路数(即最少换乘对应的线路数);若未包含终点且线路数未超过限制,则复制当前路径、添加新线路、更新线路数后将新节点入队并标记为已访问。若队列遍历结束仍未找到终点,则返回 - 1 表示无可行路线,整个过程利用 BFS 逐层扩展的特性,确保第一次找到终点时的线路数即为最少乘车数,对应最少换乘次数。

queue<QueueNode> q;
vector<bool> visited(routes.size(), false);
for (int r_idx : start_routes) {
QueueNode node;
node.line_path.clear();
node.line_path.push_back(r_idx);
node.path_amount = 1;
q.push(node);
visited[r_idx] = true;
}

queue<QueueNode> q;

visited(routes.size(), false); QueueNode node; node.line_path.clear(); node.line_path.push_back(r_idx);

node.path_amount = 1;

q.push(node); // 节点入队 visited[r_idx] = true;

}

int result = -1;

while (!q.empty()) {

QueueNode cur = q.front(); q.pop();

int last_route = cur.line_path.back();

for (int i = 0; i < routes.size(); i++) { if (visited[i]) continue;

if (has_common_stop(routes[last_route], routes[i])) {

if (is_stop_in_route(T, routes[i])) {

line_path.clear(); for (int idx : cur.line_path) { line_path.push_back(idx + 1); } line_path.push_back(i + 1); result = cur.path_amount; return result; }

if (cur.path_amount + 1 < MAX_PATH) { QueueNode next_node; next_node.line_path = cur.line_path;

next_node.line_path.push_back(i);

next_node.path_amount = cur.path_amount + 1;

visited[i] = true;

q.push(next_node);

}

}

}

} return result;

本文解析的公交路线最短换乘代码,核心是将 “线路” 抽象为图节点、“换乘” 抽象为边,通过 BFS 的层序特性保证 “最少换乘” 的最优解。该方案兼顾了 “最优性” 和 “实用性”:
最优性:BFS 天然保证第一次找到终点时的换乘次数最少;
实用性:线路级遍历避免了站点级遍历的高复杂度,适配实际公交场景的规模。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 22:34:20

Linux中ifconfig与ip命令的区别

用Linux时&#xff0c;不少人先接触的是ifconfig&#xff0c;查ip、设网卡都靠它&#xff0c;但慢慢会发现有人更爱用ip命令。那么Linux中ifconfig与ip命令的区别是什么?具体请看下文。在Linux系统中&#xff0c;ifconfig和ip命令都用于网络接口的配置和查看&#xff0c;但它们…

作者头像 李华
网站建设 2026/4/3 12:46:54

英伟达推出Nemotron 3系列开放模型,AI Agent开源了?

文&#xff5c;刘俊宏编&#xff5c;王一粟在AI大模型走向应用的时代&#xff0c;AI“卖铲人”英伟达又带来了最新的“参考答案”。12月15日&#xff0c;英伟达正式发布了Nemotron 3系列开放AI模型。该模型系列包含Nano、Super和Ultra三种规模&#xff0c;模型主打效率和领先的…

作者头像 李华
网站建设 2026/4/15 3:26:40

LobeChat能否实现AI漆艺师?东方美学装饰技法与创新应用

LobeChat能否实现AI漆艺师&#xff1f;东方美学装饰技法与创新应用 在福州一间老作坊里&#xff0c;一位年轻学徒正对着一张泛黄的《犀皮漆器制作图谱》皱眉。他能看懂文字描述&#xff0c;却难以想象“层层堆叠、打磨出波浪纹理”的真实效果。如果此刻有个经验丰富的老师傅在旁…

作者头像 李华
网站建设 2026/4/16 1:10:38

从InfluxDB到金仓:时序数据库性能拐点已至?

在物联网、工业互联网等时序数据爆发式增长的时代背景下&#xff0c;国产数据库金仓&#xff08;KingbaseES&#xff09;与国际开源时序数据库InfluxDB展开了一场深度性能角逐。根据 TSBS 标准测试结果&#xff0c;在轻负载简单查询场景下二者表现接近&#xff0c;但在高并发写…

作者头像 李华
网站建设 2026/4/15 0:32:26

基于大数据+spark+SpringBoot的农产品物流配送和库存优化系统设计与实现

前言 &#x1f31e;博主介绍&#xff1a;✌CSDN特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发、文档编写、答疑辅导等。✌…

作者头像 李华
网站建设 2026/4/6 18:34:38

LobeChat支持Markdown输出吗?代码展示效果实测

LobeChat 的 Markdown 输出能力深度解析&#xff1a;代码展示效果实测 在如今 AI 聊天应用遍地开花的时代&#xff0c;一个看似基础却至关重要的问题常常被忽视&#xff1a;这个界面能不能好好显示我需要的格式&#xff1f; 尤其是当用户希望用 AI 辅助编程、撰写技术文档或分享…

作者头像 李华