1 条题解
-
0
问题分析
餐厅每天:
- 早上需要提供 块干净餐巾
- 晚上会获得 块脏餐巾
餐巾的来源:
- 购买新餐巾:单价 ,当天可用
- 快洗: 天后可用,单价
- 慢洗: 天后可用,单价 ()
- 延期送洗:把脏餐巾留到以后送洗
目标:安排 天的餐巾使用,最小化总成本。
网络流建模
这是一个最小费用最大流问题。
关键思路:拆点
把每天拆成两个节点:
- 早上节点 :需要干净餐巾
- 晚上节点 :产生脏餐巾
建图方法
-
源点 :
- 连接每个 ,容量 = ,费用 =
→ 表示每天必须满足的需求量
- 连接每个 ,容量 = ,费用 =
-
购买新餐巾:
- 从超级源点 向每个 连边,容量 = ,费用 = → 可以任意购买新餐巾
-
快洗服务:
- 从 向 连边(如果 ),容量 = ,费用 = → 第 天晚上的脏餐巾,快洗后第 天早上可用
-
慢洗服务:
- 从 向 连边(如果 ),容量 = ,费用 =
→ 第 天晚上的脏餐巾,慢洗后第 天早上可用
- 从 向 连边(如果 ),容量 = ,费用 =
-
延期送洗:
- 从 向 连边(如果 ),容量 = ,费用 = → 把脏餐巾留到明天再决定如何处理
-
汇点 :
- 每个 连接 ,容量 = ,费用 = → 确保每天产生的脏餐巾都被正确处理
流量平衡
- 总需求:
- 提供新餐巾, 提供"虚拟需求"
- 最终 到 的最小费用最大流就是最优解
实际上更简单的建模:
- 源点 连每个 ,容量 = ,费用 = (买新)
- 连汇点 ,容量 = ,费用 = (满足需求)
- 连 ,容量 = ,费用 = (快洗)
- 连 ,容量 = ,费用 = (慢洗)
- 连 ,容量 = ,费用 = (延期)
- 源点 连每个 ,容量 = ,费用 = (产生脏餐巾)
样例验证
输入:
3 10 2 3 3 2 5 6 7参数:
- 需求:
建图后跑最小费用流:
- 总需求 =
- 最优方案(一种可能):
- 第1天:买5块新餐巾(费用50)
- 第2天:买6块新餐巾(费用60)
- 第3天:买5块新餐巾(费用50),用第1天的脏餐巾快洗2块(费用6)
- 总费用 =
输出:
145
算法步骤
- 读入 和每天需求
- 构建网络流图:
- 节点:(源), , , (汇)
- 边:
- → :容量∞,费用
- → :容量,费用
- → :容量,费用
- → (若存在):容量∞,费用
- → (若存在):容量∞,费用
- → (若存在):容量∞,费用
- 跑 到 的最小费用最大流
- 输出总费用
复杂度分析
- 节点数:
- 边数:
- 使用 SSP 或 Primal-Dual 算法: 或
- 在 时完全可行
总结
这道题通过拆点区分每天的"干净餐巾需求"和"脏餐巾产生",用容量限制需求,用费用边表示各种决策的成本,将复杂的餐巾调度问题转化为标准的最小费用流问题,是费用流的经典应用。
- 1
信息
- ID
- 3943
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者