题干信息解读
农场中有 n 块编号 1 至 n 的农田,农田间有 m 条双向道路。已知起点农田 p 的位置,以及各农田的完成状态(1 为完成,0 为未完成)。需要找到距离 p 最近且未完成的农田,若有多个则选编号最小的,若不存在则输出 0。
整体做题思路
本题通过朴素版 Dijkstra 算法求解单源最短路径,再筛选出符合条件的结果。具体步骤如下:
初始化邻接矩阵:用邻接矩阵存储农田间的道路距离,初始化为较大值(1e9),表示不可达。
读取完成状态:记录各农田是否完成(b 数组)。
处理道路信息:对于每条双向道路,更新邻接矩阵,保留最小距离(处理重边)。
计算最短路径:使用朴素 Dijkstra 算法计算起点 p 到所有农田的最短距离(适合 n≤2500 的规模)。
筛选结果:在未完成的农田中,找到距离 p 最近的;若距离相同,选择编号最小的;若不存在则输出 0。
题目中的难点和注意事项
邻接矩阵初始化:需将初始距离设为足够大的值(1e9),避免与实际道路距离冲突。
双向道路处理:每条道路需在邻接矩阵中双向更新,且保留最小距离(处理重边)。
Dijkstra 算法实现:每次需找到未访问节点中距离最小的,更新其邻接节点的距离。
结果筛选逻辑:需排除起点 p 本身(即使未完成),优先比较距离,距离相同时选编号小的。
AC代码(如有雷同,纯属巧合)(改编自@bong)
时间复杂度和空间复杂度
时间复杂度:
邻接矩阵初始化:O (n²)。
读取道路信息:O (m)。
朴素 Dijkstra 算法:O (n²)(外层循环 n 次,内层找最小值 O (n),更新距离 O (n))。
筛选结果:O (n)。
总时间复杂度:O (n² + m),对于 n≤2500、m≤6500 的规模,完全可行。
空间复杂度:
邻接矩阵:O (n²)(存储 n×n 的距离信息)。
辅助数组(b、d、v):O (n)。
总空间复杂度:O (n²),适合 n≤2500 的规模。