1 条题解

  • 0
    @ 2025-10-23 21:14:20

    问题分析

    餐厅每天:

    • 早上需要提供 rir_i 块干净餐巾
    • 晚上会获得 rir_i 块脏餐巾

    餐巾的来源:

    1. 购买新餐巾:单价 PP,当天可用
    2. 快洗MM 天后可用,单价 FF
    3. 慢洗NN 天后可用,单价 SSS<FS < F
    4. 延期送洗:把脏餐巾留到以后送洗

    目标:安排 nn 天的餐巾使用,最小化总成本


    网络流建模

    这是一个最小费用最大流问题。

    关键思路:拆点

    每天拆成两个节点:

    • 早上节点 dayiday_i:需要干净餐巾
    • 晚上节点 nightinight_i:产生脏餐巾

    建图方法

    1. 源点 SS

      • 连接每个 dayiday_i,容量 = rir_i,费用 = 00
        → 表示每天必须满足的需求量
    2. 购买新餐巾

      • 超级源点 SSSS 向每个 dayiday_i 连边,容量 = ++\infty,费用 = PP → 可以任意购买新餐巾
    3. 快洗服务

      • nightinight_idayi+Mday_{i+M} 连边(如果 i+Mni+M \leq n),容量 = ++\infty,费用 = FF → 第 ii 天晚上的脏餐巾,快洗后第 i+Mi+M 天早上可用
    4. 慢洗服务

      • nightinight_idayi+Nday_{i+N} 连边(如果 i+Nni+N \leq n),容量 = ++\infty,费用 = SS
        → 第 ii 天晚上的脏餐巾,慢洗后第 i+Ni+N 天早上可用
    5. 延期送洗

      • nightinight_inighti+1night_{i+1} 连边(如果 i+1ni+1 \leq n),容量 = ++\infty,费用 = 00 → 把脏餐巾留到明天再决定如何处理
    6. 汇点 TT

      • 每个 nightinight_i 连接 TT,容量 = rir_i,费用 = 00 → 确保每天产生的脏餐巾都被正确处理

    流量平衡

    • 总需求i=1nri\sum_{i=1}^n r_i
    • SSSS 提供新餐巾,SS 提供"虚拟需求"
    • 最终 SSSSTT最小费用最大流就是最优解

    实际上更简单的建模:

    • 源点 SSSS 连每个 dayiday_i,容量 = ++\infty,费用 = PP(买新)
    • dayiday_i 连汇点 TT,容量 = rir_i,费用 = 00(满足需求)
    • nightinight_idayi+Mday_{i+M},容量 = ++\infty,费用 = FF(快洗)
    • nightinight_idayi+Nday_{i+N},容量 = ++\infty,费用 = SS(慢洗)
    • nightinight_inighti+1night_{i+1},容量 = ++\infty,费用 = 00(延期)
    • 源点 SSSS 连每个 nightinight_i,容量 = rir_i,费用 = 00(产生脏餐巾)

    样例验证

    输入:

    3 10 2 3 3 2
    5
    6
    7
    

    参数:

    • n=3,P=10,M=2,F=3,N=3,S=2n=3, P=10, M=2, F=3, N=3, S=2
    • 需求:r1=5,r2=6,r3=7r_1=5, r_2=6, r_3=7

    建图后跑最小费用流:

    • 总需求 = 5+6+7=185+6+7=18
    • 最优方案(一种可能):
      • 第1天:买5块新餐巾(费用50)
      • 第2天:买6块新餐巾(费用60)
      • 第3天:买5块新餐巾(费用50),用第1天的脏餐巾快洗2块(费用6)
      • 总费用 = 50+60+50+6=14550+60+50+6=145

    输出:145


    算法步骤

    1. 读入 n,P,M,F,N,Sn, P, M, F, N, S 和每天需求 rir_i
    2. 构建网络流图:
      • 节点:SSSS(源), day1..daynday_1..day_n, night1..nightnnight_1..night_n, TT(汇)
      • 边:
        • SSSSdayiday_i:容量∞,费用PP
        • dayiday_iTT:容量rir_i,费用00
        • SSSSnightinight_i:容量rir_i,费用00
        • nightinight_idayi+Mday_{i+M}(若存在):容量∞,费用FF
        • nightinight_idayi+Nday_{i+N}(若存在):容量∞,费用SS
        • nightinight_inighti+1night_{i+1}(若存在):容量∞,费用00
    3. SSSSTT最小费用最大流
    4. 输出总费用

    复杂度分析

    • 节点数:2n+220022n+2 \leq 2002
    • 边数:O(n)O(n)
    • 使用 SSP 或 Primal-Dual 算法:O(fE)O(f \cdot E)O(fVlogV)O(f \cdot V \log V)
    • n1000n \leq 1000 时完全可行

    总结

    这道题通过拆点区分每天的"干净餐巾需求"和"脏餐巾产生",用容量限制需求,用费用边表示各种决策的成本,将复杂的餐巾调度问题转化为标准的最小费用流问题,是费用流的经典应用。

    • 1

    信息

    ID
    3943
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者