← 返回编程题库
coding-shortest-fee-path-routing-graph简单免费版2000ms未尝试

路由图上的最短跳数路径

Shortest Hop Path on a Routing Graph

开始编码

跨场所执行路由器把世界建模为一张图:每个场所(如 NYSEARCAIEX、内部暗池、ECN)是一个节点;两个场所之间的无向边意味着「我有预先谈好的直连路由,可以一跳把股份从一边搬到另一边」。每跳都会产生延迟和固定的每跳费用,所以路由引擎需要回答:给定 sourcetarget,最少要跳几次?这就是经典的无权最短路问题——BFS,不是 Dijkstra。

请实现 solution(venues, edges, source, target) -> intvenues 是节点 id 全集,edges[u, v] 无向边列表。返回从 sourcetarget最少跳数;若不可达返回 -1;若 source == target 返回 0(你已经在那儿了)。自环 [v, v] 是无害的,绝不能影响答案(0 成本的长度 1 环没有任何用处)。重复边按幂等处理——邻接表存 set 而非 multiset。

输入校验:sourcetarget 必须都在 venues 里;edges 中出现的所有端点也必须在 venues 里。任意违反,抛 ValueError。除此之外不应抛任何异常。

示例

solution(["A"], [], "A", "A") 返回 0。源点等于终点,零跳——这是 BFS 在循环开始前就要拦截的边界情形。

solution(["A", "B", "C", "D"], [["A","B"],["B","C"],["C","D"]], "A", "D") 返回 3。链 A—B—C—D 强制三跳;BFS 在距离 0 访问 A,距离 1 访问 B,距离 2 访问 C,距离 3 访问 D。没有捷径,所以 3 是最优解。

solution(["A", "B", "X", "Y"], [["A","B"],["X","Y"]], "A", "Y") 返回 -1。图有两个不连通分量 {A, B}{X, Y};BFS 从 A 出发耗尽所在分量也到不了 Y,所以返回不可达。

函数骨架见 stubs/stub.py

应用背景

跳数最小化是执行路由器与跨场所消息系统的实际关切。每跳之间会产生固定路由费用(按股每股小几厘,但在大母单上累计可观),加上几十到几百微秒的延迟,沿链路累加。朴素的 Dijkstra 实现虽然正确,但会引入 log V 的额外开销——当路由表每秒重算上千次时,这一项会出现在尾部延迟里。对无权情形,场所路由团队选择朴素 BFS——和网络工程师在 OSPF 邻居发现阶段对跳数路由用 BFS 的理由一致。连通性检查(不可达返回 -1)直接对应「有没有合法路径」——在算费之前先回答,便于母单回退到别的策略。同一份数据结构也支持并查集(union-find)做离线批量连通性问题(「开盘前把所有 venues 划分到可达性分组」),这正是算法标签同时包含 bfsunion-find 的原因:BFS 解每查询的路径长度,union-find 批量预算分量标签。

约束条件

  • 1 ≤ len(venues) ≤ 10000
  • 0 ≤ len(edges) ≤ 100000
  • venue 名为字母数字,长度 ≤ 16,区分大小写
  • edges 为无向边;每项是 2 元素列表 `[u, v]`
  • 重复边允许,按集合幂等去重
  • 自环 `[v, v]` 允许且必须无害(不能影响答案)
  • source、target ∈ venues,否则抛 ValueError
  • 边的端点必须都在 venues 里,否则抛 ValueError
  • 若 target 不可达,返回 -1
  • 若 source == target,返回 0(无需跳跃)

样例

Case 1 · source equals target — zero hops

输入: [["A"],[],"A","A"]

期望: 0

源点等于终点,无需任何跳跃,返回 0。这是 BFS 在主循环开始之前就要短路返回的边界情形。

Case 2 · single direct edge — one hop

输入: [["A","B"],[["A","B"]],"A","B"]

期望: 1

A 与 B 直连,BFS 第一层就发现 B,距离 1。

Case 3 · chain of length 3 — three hops, no shortcut

输入: [["A","B","C","D"],[["A","B"],["B","C"],["C","D"]],"A","D"]

期望: 3

链 A—B—C—D 强制 3 跳;BFS 的层级正好是距离。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · source equals target — zero hops

输入: [["A"],[],"A","A"]

期望: 0

源点等于终点,无需任何跳跃,返回 0。这是 BFS 在主循环开始之前就要短路返回的边界情形。

Case 2 · single direct edge — one hop

输入: [["A","B"],[["A","B"]],"A","B"]

期望: 1

A 与 B 直连,BFS 第一层就发现 B,距离 1。

Case 3 · chain of length 3 — three hops, no shortcut

输入: [["A","B","C","D"],[["A","B"],["B","C"],["C","D"]],"A","D"]

期望: 3

链 A—B—C—D 强制 3 跳;BFS 的层级正好是距离。