CF 2400~3000 flows 板刷

CF62E World Evil

远古 2700。

给定 \(n\times m\) 网格图,每条边有容量。令第一列为源点,第 \(m\) 列为汇点,求最大流。\(n\le 5,m\le 10^5\)

最大流转最小割,然后状压 DP 即可。\(dp[i][S]\) 表示前 \(i\) 列阻断了 \(S\) 内的行的最小代价。

CF103E Buying Sets

给定 \(n\) 个集合,每个集合有属性 \(a_i\)。题目保证对于任意的 \(k\),任意 \(k\) 个集合,它们并的大小 \(\ge k\)
求一个集合选法,要求它们的并大小等于选的个数,最大化所选的集合属性之和。


2900,比较有意思的题。

容易想到把集合作为左部点,元素作为右部点,集合向它包含的元素连边。问题转化为给定一张二分图,在左部选若干个点,满足右边被覆盖的点的个数与左边选的个数相等,求最大和。

因为任意 \(k\) 个集合的并大小 \(\ge k\),所以如果给每个元素赋权值 \(-\infty\),每个集合赋权值 \(+\infty\),那最优解肯定恰好是集合与元素个数相等。于是转化为最大权闭合子图问题,容易使用网络流解决。

但是这题没完,题解区给出了一种即使不满足任意 \(k\) 个集合并的大小 \(\ge k\) 的条件也能做的方法。

对于一个左部点集合 \(S\),它合法的条件是 \(|N(S)|=|S|\)。而注意到对于两个合法集合 \(A,B\)\(A\cup B\) 也是合法的。这说明可以求出一个极小合法集合的组,任意合法方案都可以由其中的集合并起来得到。

怎么求这个组?枚举左部点 \(i\),求出最小的包含 \(i\) 的合法集合即可。

然后考虑对于 \(i\) 怎么求这个最小的合法集合。

求出最大匹配,维护一个集合 \(S\) 初始等于 \(\{i\}\)。对于任意边 \((u,v)\),若 \(u\in S\)\(v\) 的匹配点 \(v'\not\in S\),将 \(v'\) 加入 \(S\)。重复操作直到停止,\(S\) 即为最小的包含 \(i\) 的集合选法。

考虑如何优化这个过程。对于一条非匹配边 \((u,v)\),令 \(u\)\(v\) 的匹配点 \(v'\) 连边,则 \(i\) 能到达的点集就是 \(S\)。连了这些边时候,问题转化为 "给定一张有向图,每个点有权值,选了一个点就要选它的后继。求最大和。",容易用闭合子图模型解决。

posted @ 2024-12-11 14:02  FLY_lai  阅读(42)  评论(0)    收藏  举报