1 条题解

  • 0
    @ 2025-10-24 9:18:22

    问题分析

    我们有:

    • nn 个人和 nn 件工作
    • ii 个人做第 jj 件工作的效益为 cijc_{ij}
    • 要求:
      1. 每个人做 exactly 1 件工作
      2. 每件工作由 exactly 1 个人做
      3. 最小总效益最大总效益

    这实际上是二分图完美匹配问题,左部是人,右部是工作。


    网络流建模

    建图方法

    1. 源点 SS 向每个ii 连边:

      • 容量 = 11,费用 = 00
    2. 每个ii 向每个工作 jj 连边:

      • 容量 = 11,费用 = cijc_{ij}(或 cij-c_{ij}
    3. 每个工作 jj汇点 TT 连边:

      • 容量 = 11,费用 = 00

    算法步骤

    最小总效益

    1. 按上述方法建图,边 (i,j)(i,j) 的费用 = cijc_{ij}
    2. 运行最小费用最大流算法
    3. 当最大流 = nn 时(完美匹配),输出总费用

    最大总效益

    1. 建图时边 (i,j)(i,j) 的费用 = cij-c_{ij}
    2. 运行最小费用最大流算法
    3. 输出总费用的相反数

    样例验证

    输入:

    5
    2 2 2 1 2
    2 3 1 2 4
    2 0 1 1 1
    2 3 4 3 3
    3 2 1 2 1
    

    效益矩阵:

    $$\begin{bmatrix} 2 & 2 & 2 & 1 & 2 \\ 2 & 3 & 1 & 2 & 4 \\ 2 & 0 & 1 & 1 & 1 \\ 2 & 3 & 4 & 3 & 3 \\ 3 & 2 & 1 & 2 & 1 \end{bmatrix} $$

    最小总效益:5
    一种最小分配:第1人做工作4(1),第2人做工作3(1),第3人做工作2(0),第4人做工作1(2),第5人做工作5(1),总和=5

    最大总效益:14
    一种最大分配:第1人做工作1(2),第2人做工作5(4),第3人做工作3(1),第4人做工作4(3),第5人做工作2(2),总和=12?等等检查一下。
    实际上样例输出是14,说明有更优分配:
    第1人工作3(2),第2人工作5(4),第3人工作1(2),第4人工作4(3),第5人工作2(3) → 2+4+2+3+3=14


    复杂度分析

    • 节点数:2n+22n + 2
    • 边数:n+n+n2=O(n2)n + n + n^2 = O(n^2)
    • 使用SSP(基于Bellman-Ford):O(nn2n)=O(n4)O(n \cdot n^2 \cdot n) = O(n^4)
    • n100n \leq 100 时完全可行

    算法说明

    这实际上是指派问题(Assignment Problem):

    • 可以用匈牙利算法O(n3)O(n^3))更高效解决
    • 但用费用流更通用,且能同时处理最小化和最大化

    对于最小总效益,就是最小权完美匹配;
    对于最大总效益,就是最大权完美匹配。


    关键点

    1. 容量为1保证每人只做一件工作,每件工作只由一人做
    2. 最大流为n保证是完美匹配
    3. 费用取负将最大化问题转化为最小化问题

    总结

    这道题展示了如何用最小费用流求解二分图匹配问题:

    • 通过容量控制保证一一对应关系
    • 通过费用设置表达优化目标
    • 能同时处理最小化和最大化问题

    是费用流在组合优化中的典型应用。

    • 1

    信息

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