闭合子图:
从原图的点集V中选取若干个点生成一个新的点集v,若任意的节点i∈v,在原图中有i->j的边时j也∈v,那么v构成的子图就被称为闭合子图.
例如有3个点1,2,3且有边1->3,2->3构成的一个图.此时有闭合子图{1,3},{2,3},{3},{1,2,3}以及∅
最大带权闭合子图:
此时每个节点都有其相应的权值,选择一个闭合子图使得他们的节点权值和最大,那么这个子图就被称为最大权闭合子图.
求解最大权闭合子图的值:
建立源汇点S,T.
①节点i权值为正的建立一条S->i容量为其权值的边
②节点i权值为负的建立一条i->T容量为其权值绝对值的边
原图中的边的容量都设为inf(无穷大)
跑一边网络流求出最小割(最大流) = maxflow
最大权闭合子图的值 = ∑(所有节点正权值和) - maxflow
证明:
已知最小割会把残量网络分为两个点集:
①S能到达的点形成的点集A
②能到达T的点形成的点集B
A0,B0分别表示A,B中原来点权是负数的点集,A1,B1分别表示A,B中点权原来是正数的点集。
A+B-{S,T} = V
简单割:最小割割边都是与S或者T直接相连的边
因为是简单割,所以割边都不是原图上的边,所以残量网络上还保留着原图.
最小割是简单割:因为没有与S或者T直接相连的边的容量都是inf,所以肯定不会是割边,所以割边的一端一定是S或T,证明完毕.
点集A是闭合子图:
反证法:如果点集A不是闭合子图,那么就有i∈A,j∈B,至少存在一条i->j的边,因为S可以到达i,又有i->j,那么就存在j∈B使得S可以到达j,所以j也∈A,此处已经矛盾了.所以A是闭合子图.
A点权和 = A1点权和 - |A0点权和|
最小割 = B1点权和 + |A0点权和|
易知B1中的点和S的连边满流,A0中的点和T的连边也是满流的(证明:不满流的话之前有与S或者T的连边,但在残量网络中怎么就到达不了了呢?)
若需证明最小割 = B1点权和 + |A0点权和|,即证明B1和A0两个点集是相对独立的.前面已经知道A0中的点不能到达B1.
所以不会存在路径有i∈A0,j∈B1使得有i到j的路径,更不会有j到i的路径,因为S到不了j,所以不会有S到T的路径上有j到i的路径.
所以B1中的点和A0中的点不会出现在同一条路径上,所以两集合相对独立,所以割边就是两个集合的叠加,即:
最小割 = B1点权和 + |A0点权和|,证明完毕
又A1点权和 + B1点权和 = 正点权和 = A点权和 + 最小割,即
A点权和 = 正点权和 - 最小割,已知最大权闭合子图值<=正点权和,又A是一个闭合子图.
所以要使得A点权和最大就要使割最小,即求最小割.证明完毕