二分图G中选取一个点集,所有边都连接了这个点集,最小化这个点权和。
这个可以说是最小割模板了
首先假设只有一对点,一条边
要选出较小值,建边(s->1,v1),(1->2,INF),(2->t,v2)
显然割开最小值。
对于多个点边,求最大流(最小割)即可。
求二分图点带权最小覆盖并输出方案。
对于一个二分图点带权最小覆盖的残余网络,只需跑一遍与s连通的点即可,若连通的是原图与t有连边的点,那么该边一定被割掉。同样,若不连通的是原图与s有连边的点,该边也一定割掉。
求一个二分图G的点集,该点集满足两两不连通,最大化点集权值。
引理:二分图独立集与最小点覆盖互补。
因为点权和一定,此时二分图点带权覆盖达到最小值。求二分图点带权最小覆盖即可。
求图G的一个点集,该点集满足所有边都连向点集内的边,求点集的最大值。(允许点权带负)。
从最小割的原理出发:首先假设一条边的两个点集都属于一个集合,之后要把两个点分开,一个连s,一个连t。
原问题等价于给定一些二元组,选了 a 就必须选择 b 。
其次,将原问题转化为最小割问题,原图的边转化为正无穷,那么这条边不可能被割掉,保证了解法的正确性。
考虑先将所有点看做一个集合,因为存在负数,那么就转负为正,并将所有负点连向t点,表示选取该点要付出的代价,同样,对于每个正值点,连向s点,表示舍弃该点损失的价值。先将正权值相加,要最小化总的权值,即求该图最小割(即最少需要减去多少)。
求一个有向图的最大权闭合子图,并输出满足最大权的最小点数方案的个数。
可以证明求出最小割后的残余网络与s相连的点是最小方案(证明略)。
更加广泛的说,是一类与横纵坐标有关的转化。
给一个n*m的矩阵,有些格子有障碍,每次操作可清除整列或整行,求最小切割次数。
将每行看做一个点,每列看做一个点,点值都为1,显然要将这两个点割开,模型同二分图点带权最小覆盖。
给定一个矩阵A,填充矩阵B,以最小化:
max⎧⎩⎨⎪⎪⎪⎪⎪⎪max|∑iaij−bij|max|∑jaij−bij|
要使最大值最小,先二分答案,从而变成了一道判定性问题。
判定最小割是否唯一。
做法:
如何判定网络的最小割是否唯一?
同样求一次最大流后在残量网络 R 中以正向弧对 s、以正向弧的逆对 t 作 DFS,只不过这次只用一个 flag[i]标记点 i 是否在两次 DFS 中被探访过。最后扫一遍所有点,如果存在没有被探访过的,则说明最小割不唯一。
顺便一提,此时在残量网络上做Tarjan求SCC,会将原图分为S集合,T集合和一堆可以属于S,T集合的SCC,之间被满流边连接,此时就可以搞事了。
判断最小割的可行边,必经边。
用到刚才所提的思想,那么直接连接 S,T 的边是必经边,连接任意两个联通块的边是可行边(因为两边可以任意属于一个集合)。
Code:http://paste.ubuntu.com/26116589/
每个点拆点求最小割就好了。
好题。题解请看:http://blog.csdn.net/qq_35649707/article/details/78728777
此题同上题,可以参考上题题解。唯一的不同是上题不能改变,这题可以改变,所以要改变从源汇点连边的容量。