1 条题解
-
0
问题概述
给定一个 的网格城市,每个网格点 是一个路口。两点间的移动规则如下:
从 到 需要时间
从 到 需要时间 所有道路都是双向的。
要求回答 个查询:从 到 的最短时间。
数据范围:
算法思路
核心思想:分治 + 最短路
由于网格规模 但查询次数 很大,不能对每个查询单独跑最短路。
分治策略:
对当前矩形区域 ,选择较长边进行切割
对切割线上的每个点作为源点,跑一次 Dijkstra 最短路算法
对于跨越切割线的查询,最短路必然经过切割线上某点 ,距离为:
dist(s,t)=dist(s,p)+dist(p,t) 递归处理不跨切割线的查询
关键实现细节
1. 坐标映射
将二维坐标 映射为一维编号:id=(i−1)×m+j
2. 图构建
每个节点与上下左右四个邻居相连(边界除外)
边权分别为对应的 或 值
3. 分治过程
如果区域宽度大于高度,按行切割;否则按列切割
切割线长度不超过
对切割线上每个点跑 Dijkstra,更新跨切割线查询的答案
4. 查询处理
对于查询 到 :
如果两点在同一子区域,递归处理
如果跨越切割线,用切割线上所有点更新答案:
复杂度分析 Dijkstra 次数:每个点参与 次
每次 Dijkstra:
总复杂度:约
在 时可行
- 1
信息
- ID
- 3150
- 时间
- 1500ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者