首页 > 其他 > 详细

CF103E

时间:2021-06-13 19:14:30      阅读:33      评论:0      收藏:0      [点我收藏+]

有一点tricky的东西,不是很难。
做法1:用jzoj一道题的做法。
考虑最大权闭合子图对每个集合拆点\(i\),每个元素拆点\(i+n\)
则集合\(i\)选择,\(S_i\)的每个元素都要选择。
\(i\)的代价为\(m_i\)\(i+n\)的代价为\(0\)
这是经典的最大权闭合子图,但是要求任意\(i\)个集合的并的元素个数必定是\(i\),不太能做。
由于规定了任意\(i\)个集合的并的元素个数必定大于等于\(i\),任意\(i\)个集合的并的元素个数-\(i\geq 0\)
也就是说对于每个子集,任意\(i\)个集合的并的元素个数\(-i\)的最小值等于\(0\)(这很难想到)
于是可以修改上面的网络流模型,用\(\inf\)限制任意\(i\)个集合的并的元素个数\(-i\)的最小值等于\(0\)
设一个选择方案的代价为价值减去\(\inf*\)限制任意\(i\)个集合的并的元素个数\(-i\)的最小值,则\(\inf*\)限制任意\(i\)个集合的并的元素个数\(-i\)的最小值必须为\(0\)才最优。
于是修改成\(i\)的代价为\(m_i+\inf\)\(i+n\)的代价为\(-\inf\)即可。
做法2:我在思考那道题时的一个想法。
这个做法本质和做法1相同。
可以用一个二元组表示选择方案的代价:\((a,b)\)表示价值为\(b\),集合的并的元素个数-\(i\)\(a\)
比较时先比较\(a\)再比较\(b\)
两个二元组\((a,b)+(c,d)\)的加法定义为\((a+c,b+d)\)
两个二元组的最小值定义为\((a-c,b-d)\)(不能定义为\((a-\min(a,c),b-\min(b,d))\)
\(i\)的代价为\((1,m_i)\)\(i+n\)的代价为\((-1,0)\),把每条边的代价也设为二元组,最大流即可。

CF103E

原文:https://www.cnblogs.com/ctmlpfs/p/14880310.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!