这篇博客不错,言简意赅一针见血
网络流——最小割求最大权闭合子图
对于这样的一类问题:
有一些点,每个点有点权,点权可正可负。
对于图中的任意一条有向边i和j,代表如果选择了点i就必须选择点j
你需要选择一些点使得得到权值最大。
(建模是注意的是,每个点只能被选择一次,即使多个链下来,但是贡献不会重复累加)
叫做最大权闭合子图问题。
(感觉,“闭合”的意思是,所有点能走到的点都选择到了,不能走到其他集合里。就闭合了。)
大概选择的是一条链,,
也就是说,在满足合法的情况下,产生最优解。
使用最小割建模方式如下:
1.先把所有的正权点做和保存在ans
2.建立两个点S,T,对于所有正权点p,连接S到p一条流量为权值的边。
对于所有负权点q,连接一条q到T的流量为权值相反数(也就是绝对值)的边。
对于原图(i,j)的有向边,对应网络中的(i,j)流量为inf的边。
3.求原图的最小割c,ans=ans-c就是答案。
证明:
抓住要点:在合法性的前提下,最优化点的权值和。
所以分开证明。
1.合法性
ans之前是所有正权点的权值和,意味着,这些点我们先选择上。
但是,可能不合法,我们不得不舍弃一些正权点,或者选择一些负权点。
可以发现,在最小割中,
留下S到i的边,意味着选择这个正权点;切断i到T的边,意味着选择这个负权点。
只要证明,如果选择了一个点,我一定选择了这个点的所有后继。
如果选择了一个正权点,对应S到i的一条边
那么,为了使得S到T不连通,它“下游”的所有走向T的边都要被砍断。
而,对于它“下游”的所有S到i的边,它们的存在并不会影响S到T的联通性。所以由于是最小割,一定不会选择砍掉。
那么后继就都选择上了。
如果选择了一个负权点。
其上游必然有一个正权点。否则,根据最小割,我们不会选择它。
那么这个上游的正权点选择上了,根据上面的证明,那么这个负权点的下游也一定会被选上。
2.最优化
ans=正权点之和-牺牲的代价
正权点之和是一个定值。
最小割的大小就是牺牲的代价。
由于最小割最小,所以ans最大。
例题:
选择A,B可以有C的收益。
不好处理。
因为,多选择了一个信号站,可能造成很多收益,没办法统计。
反过来。
如果想要有C的收益,那么必须建立A,B信号站!
所以,把每个用户看做一个点,向A,B连边。信号站权值-P,用户权值+C
然后最大权闭合子图即可。
考虑品尝一个的di,j一定也会选择d>=i <=j的
所以就是最大权闭合子图了
减少边数,di,j->di,j-1,di+1,j
对于di,i,连到某个-ai的点,连到象征ai的-ai*ai*m的点
这样,最后选择的一定符合要求。收益di,j选择上了,花费也选择上了,并且满足“种”(即只算一次)和mx^2算且只算一次的要求。