1 条题解
-
0
问题分析
我们有:
- 个人和 件工作
- 第 个人做第 件工作的效益为
- 要求:
- 每个人做 exactly 1 件工作
- 每件工作由 exactly 1 个人做
- 求最小总效益和最大总效益
这实际上是二分图完美匹配问题,左部是人,右部是工作。
网络流建模
建图方法
-
源点 向每个人 连边:
- 容量 = ,费用 =
-
每个人 向每个工作 连边:
- 容量 = ,费用 = (或 )
-
每个工作 向汇点 连边:
- 容量 = ,费用 =
算法步骤
最小总效益
- 按上述方法建图,边 的费用 =
- 运行最小费用最大流算法
- 当最大流 = 时(完美匹配),输出总费用
最大总效益
- 建图时边 的费用 =
- 运行最小费用最大流算法
- 输出总费用的相反数
样例验证
输入:
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
复杂度分析
- 节点数:
- 边数:
- 使用SSP(基于Bellman-Ford):
- 在 时完全可行
算法说明
这实际上是指派问题(Assignment Problem):
- 可以用匈牙利算法()更高效解决
- 但用费用流更通用,且能同时处理最小化和最大化
对于最小总效益,就是最小权完美匹配;
对于最大总效益,就是最大权完美匹配。
关键点
- 容量为1保证每人只做一件工作,每件工作只由一人做
- 最大流为n保证是完美匹配
- 费用取负将最大化问题转化为最小化问题
总结
这道题展示了如何用最小费用流求解二分图匹配问题:
- 通过容量控制保证一一对应关系
- 通过费用设置表达优化目标
- 能同时处理最小化和最大化问题
是费用流在组合优化中的典型应用。
- 1
信息
- ID
- 3987
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者