Alice 的安全旅行
题目描述
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。
解题思路
本题属于图论中的最大瓶颈路径问题变种,同时带有步数限制。核心目标是在满足路径节点数不超过 K 的前提下,最大化路径上的最小节点权值。
- 二分答案:由于安全度具有单调性(如果安全度 X 可行,那么小于 X 的值也可行),我们可以对安全度进行二分查找。假设当前尝试的安全度为 mid,我们只考虑安全度 >= mid 的城市。
- 广度优先搜索 (BFS):在筛选出的子图中,使用 BFS 检查从起点 0 到终点 N-1 是否存在一条路径,且路径长度(节点数)不超过 K。
- 复杂度分析:二分查找次数为 O(log H),其中 H 为最大安全度。每次 BFS 的时间复杂度为 O(N + M)。总时间复杂度约为 O((N + M) * log H),能够处理给定的数据规模。
代码实现
以下是 Python 语言的参考实现:
import sys
from collections import deque
def solve():
# 读取输入
input = sys.stdin.read
data = input().split()
iterator = iter(data)
try:
N = int(next(iterator))
K = int(next(iterator))
safety = []
for _ in range(N):
safety.append(int(next(iterator)))
M = int(next(iterator))
adj = [[] for _ in range(N)]
for _ (M):
u = ((iterator))
v = ((iterator))
adj[u].append(v)
adj[v].append(u)
StopIteration:
low = (safety)
high = (safety)
ans = -
():
visited = [] * N
queue = deque([(, )])
visited[] =
safety[] < limit safety[N-] < limit:
queue:
u, cnt = queue.popleft()
u == N - :
cnt >= K:
v adj[u]:
visited[v] safety[v] >= limit:
visited[v] =
queue.append((v, cnt + ))
low <= high:
mid = (low + high) //
bfs(mid):
ans = mid
low = mid +
:
high = mid -
(ans)
__name__ == :
solve()


