1 条题解
-
0
问题分析
我们有:
- 个太空站(编号 ),地球(),月球(,实际处理用 )
- 艘太空船,每艘容量 ,按固定周期在若干站点间循环停靠
- 个人初始在地球,要全部运到月球
- 每个时间单位,太空船移动到下一个停靠站
- 人只能在整点时刻上下船
目标:求最短的时间 ,使得 个人都能到月球。
关键思路:时间分层
由于太空船位置随时间周期性变化,我们按时间建立分层图:
- 对每个时间 创建一套节点(地球、各空间站、月球)
- 节点 表示在时刻 位于该站点
建图方法:
-
站内停留:
,容量
→ 人可以在空间站等待 -
太空船移动:
如果太空船 在时刻 在站 ,时刻 在站 ,则连边:
,容量
→ 太空船可运送最多 人 -
源点和汇点:
- 源点 连接 ,容量
- 每个时刻的月球节点连接汇点 ,容量
算法框架
由于不知道最小时间 ,需要枚举答案:
- 从 开始,逐步增加
- 对每个 :
- 构建分层图(时间 )
- 计算 到 的最大流
- 如果最大流 = ,说明 天内可以运完所有人,输出
- 如果 超过某个上界仍未找到解,输出 (无解)
复杂度分析
- 节点数:
- 边数:
- 最大流算法(Dinic):
- 在 时, 不会太大(几百以内),完全可行
样例验证
输入:
2 2 1 1 3 0 1 2 1 3 1 2 -1太空船信息:
- 船1:容量1,路线 (周期3)
- 船2:容量1,路线 (周期3)
枚举 :
- :最大流=0,无法到达月球
- :最大流=1,可以运完
方案(可能):
- 时刻0:人在地球
- 时刻1:乘船1到站1
- 时刻2:乘船1到站2
- 时刻3:在站2换乘船2
- 时刻4:乘船2到月球
- 时刻5:到达月球
输出:
5
算法步骤
- 读入 和太空船信息
- 预处理每艘船在每个时刻的位置
- 枚举 直到上界:
- 构建分层图(时间 )
- 添加边:
- 站内停留边
- 太空船移动边
- 源点→,容量
- 所有 →汇点,容量
- 跑最大流
- 如果流值 = ,输出 并结束
- 如果超过上界未找到解,输出
上界估计
最坏情况: 个人一次只能运 人,需要 趟,每趟可能需 时间
→ 上界可设为 的几倍,或直接设几百。
总结
这道题通过时间分层将动态的太空船移动问题转化为静态的网络流图,结合枚举答案找到最短时间,是分层图网络流的典型应用。关键在于将"时间"这一维度显式地建模到图结构中。
- 1
信息
- ID
- 3991
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者