华为 · 图 · 算法编程题
华为 M ≤ 50 时限 1 秒 / 256 MB

题目描述

在遥远的未来,人类文明已经步入深空时代。广袤的宇宙中散布着数不尽的星系,而连接这些星系的,是由一个古老文明遗留下来的神秘“虫洞网络”(Wormhole Networks)。每个独立的虫洞网络都连接着一系列的星系。要进入任何一个虫洞网络,飞船都需要消耗特定的能量来激活跃迁引擎。一旦进入某个网络,飞船便可以在该网络所覆盖的所有星系之间进行无消耗的瞬时跳跃。
作为一名星际领航员,您的任务是规划一条从起点星系到目标星系的最优航线。
整个已知宇宙可以被看作一个图,其中的节点是星系,编号从 0 到 500 。总共有 M 个独立的虫洞网络。
虫洞网络 i :这是一个由 n_i 个星系组成的集合,记作 W_i = s_i,1, s_i,2, ..., s_i,n_i 。
跃迁成本 C_i :要使用虫洞网络 i 进行旅行,必须首先支付 C_i 的能量。支付后,您可以在 W_i 集合内的任意两个星系之间自由、无限次地移动,无需额外花费。
您的飞船初始位于星系 S_start ,目标是抵达星系 S_dest ,并且飞船的总备用能量为 E_total 。您需要计算出从 S_start 到 S_dest 所需的最小总能量消耗。一次旅行可能需要穿越多个虫洞网络,当您从一个网络 W_i 前往另一个网络 W_j 时,您必须先通过一个共同的“中转星系” s_transfer (即 s_transfer ∈ W_i W_j ),然后支付网络 W_j 的跃迁成本 C_j 。
如果无法抵达目标星系,或者最低能量消耗超出了您的总备用能量 E_total ,则视为任务失败。

输入输出

输入描述
第一行包含四个整数: M, S_start, S_dest, E_total 。
M :虫洞网络的总数量。( 1 ≤ M ≤ 50 )
S_start :起始星系的编号。( 0 ≤ S_start ≤ 500 )
S_dest :目标星系的编号。( 0 ≤ S_dest ≤ 500 , S_start ≠ S_dest )
E_total :飞船的总备用能量。( 1 ≤ E_total ≤ 500 )
接下来的 M 行,每行描述一个虫洞网络,格式如下:
C_i n_i s_i,1 s_i,2 ... s_i,n_i
C_i :进入该网络的跃迁成本。( 1 ≤ C_i ≤ 10 )
n_i :该网络连接的星系数量。( 1 ≤ n_i ≤ 10 )
s_i,j :该网络中的星系编号。( 0 ≤ s_i,j ≤ 500 )
输出描述
输出一个整数,代表从 S_start 到 S_dest 的最小能量消耗。
如果无法抵达或能量不足,则输出 -1 。

样例共 2 组

样例 1
输入
1 45 103 383
1 9 45 103 182 198 244 306 416 460 490
输出
1
样例 2
输入
4 14 19 99
8 5 11 13 22 24 44
1 1 18
3 1 22
6 7 2 12 14 17 30 36 39
输出
-1

算法解析依据充分

考点:图

数据规模 M ≤ 50 | 限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:M ≤ 50
  • 元素值域:S_start ≤ 500,S_dest ≤ 500,E_total ≤ 500(注意整数类型选择,避免溢出)
  • 复杂度门槛:允许 O(n³) ~ O(n⁴) 的多重循环,可以放心枚举。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:图

本题切入点

把每个虫洞网络视作一个「集团」,集团内任意两星系距离为 0:建图(星系 ↔ 集团)后做以「已付成本」为边权的最短路(Dijkstra/0-1 BFS),代价超 E_total 或不可达输出 −1。

把关系抽象成点与边,再按问的类型选遍历/最短路/连通性算法。

思路框架(图 通法 · 非本题专属)

  1. 建图:邻接表(稀疏)或邻接矩阵(稠密)。
  2. 问「最少几步 / 最短路径」且边权为 1 → BFS。
  3. 问「是否连通 / 需要加几条边连通」→ 并查集 / 连通块计数。
  4. 问「带权最短路」→ Dijkstra(非负权)或 Floyd(点数小、多源)。
  5. 问「依赖顺序」→ 拓扑排序。

实现要点:注意是有向图还是无向图,无向图加边记得双向。

复杂度:时间 O(V+E) 遍历 / O(E log V) Dijkstra | 空间 O(V+E)

该范式的通法易错点

  • 无向图只加了单向边。
  • BFS 入队时没标记访问,导致重复入队。

对照本题

  • 数据规模 M ≤ 50,允许 O(n³) ~ O(n⁴) 的多重循环,可以放心枚举。
  • 元素值域最大到 500 —— 求和 / 相乘时记得开 64 位整数。

样例

样例 1

  • 输入:1 45 103 383 / 1 9 45 103 182 198 244 306 416 460 490
  • 输出:1

样例 2

  • 输入:4 14 19 99 / 8 5 11 13 22 24 44 / 1 1 18 / 3 1 22 / 6 7 2 12 14 17 30 36 39
  • 输出:-1

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-9月24号开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解