1 条题解
-
0
问题分析
我们有一个数字梯形:
- 第 行有 个数字
- 第 行有 个数字
- 从顶部到底部可以走左下或右下方向
- 要找 条路径,使得路径上数字总和最大
三种规则:
- 路径互不相交:节点和边都不能重复
- 仅在数字结点处相交:节点可以重复,边不能重复
- 允许在数字结点相交或边相交:节点和边都可以重复
通用建模思路
将梯形中的每个数字位置看作图中的一个节点,用费用流求解:
- 每个节点的数字作为费用
- 通过容量限制来控制路径的相交规则
- 源点连接第一行的 个节点
- 最后一行的节点连接汇点
规则1:路径互不相交
建图方法
- 拆点:将每个节点 拆成 和 ,连边容量 ,费用 = 该节点的数字值
- 移动边:从 向它左下和右下的节点的 连边,容量 ,费用
- 源点:向第一行 个节点的 连边,容量 ,费用
- 汇点:从最后一行所有节点的 向汇点连边,容量 ,费用
原理
- 拆点容量为 保证每个节点最多被一条路径使用
- 边容量为 保证边不被重复使用
- 这样就保证了路径完全不相交
规则2:仅在数字结点处相交
建图方法
- 拆点:每个节点 拆成 和 ,连边容量 ,费用 = 该节点的数字值
- 移动边:从 向它左下和右下的节点的 连边,容量 ,费用
- 源点:向第一行 个节点的 连边,容量 ,费用
- 汇点:从最后一行所有节点的 向汇点连边,容量 ,费用
原理
- 拆点容量 允许节点被多条路径使用
- 边容量为 保证边不被重复使用
- 这样路径可以在节点相交,但边不重复
规则3:允许在数字结点相交或边相交
建图方法
- 拆点:每个节点 拆成 和 ,连边容量 ,费用 = 该节点的数字值
- 移动边:从 向它左下和右下的节点的 连边,容量 ,费用
- 源点:向第一行 个节点的 连边,容量 ,费用
- 汇点:从最后一行所有节点的 向汇点连边,容量 ,费用
原理
- 所有容量都是 (除了源点出发的边)
- 允许节点和边都被多条路径使用
- 这样路径可以完全自由相交
样例验证
输入:
2 5 2 3 3 4 5 9 10 9 1 1 1 10 1 1 1 1 10 12 1 1梯形结构:
第1行: 2 3 第2行: 3 4 5 第3行: 9 10 9 1 第4行: 1 1 10 1 1 第5行: 1 1 10 12 1 1规则1结果:66
规则2结果:75
规则3结果:77随着限制放宽,最大总和增加,因为可以重复利用高价值的节点。
算法步骤
对每种规则:
- 根据规则建立对应的网络流图
- 运行最大费用最大流算法(将费用取负值或用支持负费用的算法)
- 输出最大流值为 时的最大费用
复杂度分析
- 节点数:,最多 个原始节点,拆点后约 个
- 边数:,每个节点最多2条出边
- 使用费用流算法(如SSP):在这样规模下完全可行
总结
这道题通过拆点和容量控制来精确描述不同的路径相交规则:
- 规则1:节点容量1,边容量1 → 完全不相交
- 规则2:节点容量∞,边容量1 → 节点可交,边不交
- 规则3:节点容量∞,边容量∞ → 完全自由相交
展示了网络流在路径规划问题中的强大建模能力。
- 1
信息
- ID
- 3976
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者