华为OD机考双机位C卷 - Alice的安全旅行 (Java & Python & JS & GO & C++ & C)

3 阅读3分钟

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)来解决。

  1. 二分答案: 假设我们设定一个安全度阈值 XX。如果存在一条路径,满足以下条件,则说明 XX 是可行的:

    • 路径上所有城市(包括起点和终点)的安全度都 X\ge X
    • 路径经过的城市数量 K\le K
    • 路径起点是 0,终点是 N-1。

    如果 XX 可行,我们尝试更大的安全度;如果不可行,我们尝试更小的安全度。

  2. 路径存在性检查 (Check 函数): 对于给定的阈值 XX,如何检查是否存在满足条件的路径?

    • 我们可以将所有安全度 <X< X 的城市视为不可达(或在图中删除)。
    • 在剩下的图中,我们需要找到从起点 0 到终点 N-1 的最短路径(边权为 1)。
    • 使用 广度优先搜索 (BFS) 可以找到最短路径。如果 BFS 能到达终点 N-1,且最短路径长度(节点数) K\le K,则 check 成功。
    • 注意:如果起点 0 或终点 N-1 本身的安全度 <X< X,则直接返回 false。
  3. 二分范围:

    • 下界 left:所有城市安全度的最小值,或者 0。
    • 上界 right:所有城市安全度的最大值。
    • 更优的范围:可以将所有出现的唯一安全度值排序,在这些值中进行二分。

复杂度分析

  • 时间复杂度:

    • 二分查找的次数为 O(log(maxH))O(\log (\max H)),其中 HH 是安全度值范围。如果对安全度值离散化,次数为 O(logN)O(\log N)
    • 每次 check 需要进行一次 BFS。BFS 的时间复杂度为 O(N+M)O(N + M),其中 NN 是节点数,MM 是边数。
    • 总时间复杂度:O((N+M)log(maxH))O((N + M) \log (\max H))
    • 题目中 N,K105,M2×105N, K \le 10^5, M \le 2 \times 10^5,这个复杂度是可以接受的。
  • 空间复杂度:

    • O(N+M)O(N + M),用于存储图的邻接表。