Description
题目链接:Luogu 1361
小 M 在开辟了两块巨大的耕地 $A$ 和 $B$(你可以认为容量无穷),现在他有 $n$ 种作物的种子各 $1$ 个,编号为 $1$ 到 $n$。第 $i$ 种作物在 $A$ 中种植可以获得 $a_i$ 的收益,在 $B$ 中种植可以获得 $b_i$ 的收益。某些作物种在同一块耕地中可以获得额外的收益,小 M 找到 $m$ 种作物的组合,每个组合用 $c_1,c_2,k $ 和一个序列 $p_1,p_2,\cdots.p_k$ 表示,代表这 $k$ 种作物共同种在 $A$ 和 $B$ 耕地中可以分别获得 $c_1$ 和 $c_2$ 的额外收益。求收益的最大值。
数据范围:$1\le n,m\le 1000$
Solution
通过「算法笔记」网络流 - 最小割 中问题模型的分析,我们可以发现这题每种作物只能选择一个耕地,满足二者选其一的性质,所以我们可以考虑用最小割来解决。
对于单独的作物直接从源点 $s$ 连边或向 $t$ 连边即可,难点在如何处理组合的关系。
首先明确一点,一个组合就是一个点集,它的贡献有三种情况:对集合 $A$ 有贡献;对集合 $B$ 有贡献;没有任何贡献。这意味着只划分出一种状态是无法描述的,我们需要把 $A$ 和 $B$ 集合分开考虑。
接下来讨论点集 $\{u,v,w\}$ 对集合 $A$ 的贡献。
按照题意,我们的要求是:只要 $u,v,w$ 其中一者被割进了集合 $B$(连向 $t$),那么这个点集都没有贡献。换言之,只要其中一个点在集合 $B$,那么代表点集和集合 $A$ 的连边必须断开!
我们先用一个虚点 $x$ 从 $s$ 连一条代表贡献的边(显然点集必须用一个虚点代替)。如果其中一个点被割进了集合 $B$,那么这条代表贡献的边就要被断开,而 $x$ 到 $u,v,w$ 的边不能被断开。所以我们可以得到:边 $(s,x)$ 的容量为 $c_1$,边 $(x,u),(x,v),(x,w)$ 的容量均为 $\text{INF}$(因为只有容量为正无穷的边不可能被断开)。
这个点集对集合 $B$ 的贡献同理。经过检验,我们发现这样的连边方式是完全正确的!直接建图跑最小割即可。
注意:答案为总的收益减去最小割!
时间复杂度:$O(n^2m)$($\text{Dinic}$)
Code
1 |
|