**找孤立水站**
2026 华为OD机试真题 5月10日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
城市供水管道由若干个连接外部的源头水站,以及内部水站、水管组成。 全市共有 n 个水站,编号为 0 至 n−1。 供水网络由若干管道连接,管道分为两类:
- 单向管道 (Type 0):水流只能从水站 u 流向水站 v。
- 双向管道 (Type 1):水流可以在水站 u 和 v 之间双向流动。
受战争影响,城市中的一部分供水管道破裂导致部分水站无法获得供水,我们称为孤立站。
假设源头站一定有水(非孤立站),请你根据输入的各个水站的联通情况,输出孤立站的列表,从小到大进行排列。
2026 华为OD机试真题 5月10日华为OD上机新系统考试真题 100 分题型
输入描述
n:整型,水站数量,水站编号为 0 至 n−1,0<n≤10000;
sources:整型数组,数组元素为源头水站编号;
pipes:二维数组,数组元素为 [u,v,type],表示水站连通关系,其中 u,v 为水站编号,type 为连通类型。
-
[u,v,0] 表示:单向管道,水可由u流向v,不可由v流向u
-
[u,v,1] 表示:双向管道,水可由u流向v,也可由v流向u
输入格式:n,sources,pipes,例如:5,[1],[[1,0,0],[1,2,0]]
输出描述
孤立站列表,类型为整型数组,数组元素为孤立站编号,结果从小到大排列。
输出格式:[站编号1,站编号2,...],若无孤立站则输出[]。
示例1
输入
5,[1],[[1,0,0],[1,2,0]]
输出
[3,4]
说明
1 号为源头站,从 1 号到 0 号和 2 号都有单向流动,3 号、4 号为孤立站。
示例2
输入
5,[0,1],[[0,2,0],[0,3,0],[4,3,0]]
输出
[4]
说明
0 号、1 号是源头站,0、1 非孤立站;
0 号向 2 号和 3 号是单向流通,2、3 非孤立站;
4 号向 3 号单向流通,但是无水站向 4 号供水,4 是孤立站。
示例3
输入
5,[0],[[0,1,1],[0,2,1],[3,2,1],[4,2,1]]
输出
[]
说明
0 号站到 1 号、2 号为双向流通,1、2 非孤立站;
3 号、4 号到 2 号为双向流通,3、4 非孤立站;
所以系统无孤立站。
解题思路
本题本质上是有向图的可达性搜索:从所有源头站出发,通过管道(单向/双向)能到达的水站都是有供水的,反之无法到达的水站即为孤立站。
算法步骤:
- 建立邻接表:根据管道类型建图,单向管道只加一条有向边,双向管道加两条有向边。
- BFS 多源遍历:所有源头站同时入队,标记为已访问(已有供水)。
- 沿水流方向扩展:从已访问水站出发,通过邻接表扩展到相邻水站,直到队列为空。最终 visited 数组标记了所有能获得供水的水站。
- 收集结果:遍历 0 到 n-1,未被访问的水站编号即为孤立站,按从小到大顺序收集。
复杂度分析
- 时间复杂度: O(n + m),其中 m 为管道数量,每个节点和边最多访问一次。
- 空间复杂度: O(n + m),邻接表和访问数