Alice的安全旅行
2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷
华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)
题目描述
Alice计划从城市0出发最终到达城市N-1,他可以选择一条路线,但路上经过的城市总数(包括起点和终点)不能超过K个,每个城市都有一个安全度值,整个旅程的安全度被定义为路径上所有城市安全度的最小值,她的目标是让这个最小值尽可能高,请问Alice的旅程总体安全度最大能为多少?
输入描述
第一行有两个整数N和K,表示一共N个城市,以及Alice最多去K个城市(2<N<100000,1<K<100000)
接下来N行 每行包括一个整数h 表示去某个城市的安全度0=<h<=1000000000
接下来一行有一个整数M,表示城市间的M条道路,0<M<200000
接下来M行 每行有两个整数s0 s1 表示城市s0和s1之间有双向道路相通
输出描述
一 个整数,表示Alice这趟旅行的最大安全度,若不存在符合条件的路线,返回-1
示例1
输入
4 3
8
10
7
10
3
0 1
0 2
2 3
输出
7
说明
解题思路
核心思想
本题要求寻找一条从城市 0 到城市 N-1 的路径,使得路径上所有城市安全度的最小值尽可能大,同时路径长度(经过的城市总数)不能超过 K。
这是一个典型的最大化最小值问题,通常可以使用二分答案(Binary Search on Answer)来解决。
-
二分答案: 假设我们设定一个安全度阈值 。如果存在一条路径,满足以下条件,则说明 是可行的:
- 路径上所有城市(包括起点和终点)的安全度都 。
- 路径经过的城市数量 。
- 路径起点是 0,终点是 N-1。
如果 可行,我们尝试更大的安全度;如果不可行,我们尝试更小的安全度。
-
路径存在性检查 (Check 函数): 对于给定的阈值 ,如何检查是否存在满足条件的路径?
- 我们可以将所有安全度 的城市视为不可达(或在图中删除)。
- 在剩下的图中,我们需要找到从起点 0 到终点 N-1 的最短路径(边权为 1)。
- 使用 广度优先搜索 (BFS) 可以找到最短路径。如果 BFS 能到达终点 N-1,且最短路径长度(节点数) ,则 check 成功。
- 注意:如果起点 0 或终点 N-1 本身的安全度 ,则直接返回 false。
-
二分范围:
- 下界
left:所有城市安全度的最小值,或者 0。 - 上界
right:所有城市安全度的最大值。 - 更优的范围:可以将所有出现的唯一安全度值排序,在这些值中进行二分。
- 下界
复杂度分析
-
时间复杂度:
- 二分查找的次数为 ,其中 是安全度值范围。如果对安全度值离散化,次数为 。
- 每次 check 需要进行一次 BFS。BFS 的时间复杂度为 ,其中 是节点数, 是边数。
- 总时间复杂度:。
- 题目中 ,这个复杂度是可以接受的。
-
空间复杂度:
- ,用于存储图的邻接表。