1 条题解
-
0
题目理解
Bajtek 需要从学校(路口 )回家(路口 ),可以乘坐公交车,但最多只能换乘 次。每条公交线路有固定的发车时间表和路线。我们需要找到他最早能到家的时间。
算法思路
核心思想:分层图 + 动态规划
这个问题可以看作是在一个带有时间约束的公交网络中最短路问题,但由于公交车的发车时间有周期性,直接使用传统最短路算法比较困难。
关键数据结构
- 道路网络:使用哈希表
E存储路口间的通行时间 - 公交线路:
bus[i]存储第 条线路的站点序列和累计时间obus[x]存储经过路口 的所有公交线路及站点位置
- 动态规划数组:
d[j][i]:使用不超过 次换乘到达路口 的最早时间db[j][i][t]:使用不超过 次换乘,在公交线路 的第 个站点的最早时间
算法流程
-
初始化:
- 读取输入数据,构建道路网络和公交线路信息
- 初始化 DP 数组为无穷大,设置起点时间为
-
分层动态规划:
- 外层循环枚举换乘次数 (从 到 )
- 内层处理两种状态转移:
转移1:在公交车上前进
if (t) db[j&1][i][t] = min(db[j&1][i][t], db[j&1][i][t-1] + bus[i][t].second - bus[i][t-1].second);转移2:从路口上车
d[j&1][x] = min(d[j&1][x], db[j&1][i][t]);转移3:换乘到其他公交车
- 计算在路口 换乘到公交 的时间:
- 如果公交车已经到达:直接上车
- 否则:等待下一班车
-
答案提取:
- 在每层结束时检查是否到达终点
- 最终输出最早到达时间或 "NIE"
时间复杂度分析
- 道路处理:
- 公交线路处理:
- 动态规划:
- 总体:在数据范围内可接受
算法标签
主要标签:
- 动态规划(Dynamic Programming)
- 分层图最短路(Layered Graph Shortest Path)
- 公交网络优化(Transit Network Optimization)
次要标签:
- 状态压缩(使用滚动数组优化空间)
- 时间离散化(处理周期性发车时间)
- 图论(Graph Theory)
代码亮点
- 空间优化:使用
j & 1实现滚动数组,将空间复杂度从 降到 - 高效存储:使用哈希表存储边权,
obus数组快速查询经过某路口的所有公交 - 时间计算:正确处理周期性发车的等待时间计算
总结
这道题通过将问题转化为分层图上的动态规划,巧妙地处理了公交网络的复杂时间约束。算法在保证正确性的同时,通过多种优化手段控制了复杂度,是一个典型的运输网络优化问题解决方案。
- 道路网络:使用哈希表
- 1
信息
- ID
- 3847
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者