最小割模型汇总

    • 二分图点带权最小覆盖
      • 例题poj2125
    • 二分图最大点权独立集
    • 最大权闭合子图
      • 例题poj2987Firing
    • 矩阵
      • poj3041Asteroids
      • bzoj2406 矩阵
    • 最小割的唯一性
        • ZOJ2587
        • BZOJ1797
    • 图的连通性
        • Ural1277
    • 异或相关
        • BZOJ2400
        • spoj1693

1.二分图点带权最小覆盖

二分图G中选取一个点集,所有边都连接了这个点集,最小化这个点权和。

这个可以说是最小割模板了
首先假设只有一对点,一条边

要选出较小值,建边(s->1,v1),(1->2,INF),(2->t,v2)

最小割模型汇总_第1张图片

显然割开最小值。
对于多个点边,求最大流(最小割)即可。

例题:poj2125

求二分图点带权最小覆盖并输出方案。

对于一个二分图点带权最小覆盖的残余网络,只需跑一遍与s连通的点即可,若连通的是原图与t有连边的点,那么该边一定被割掉。同样,若不连通的是原图与s有连边的点,该边也一定割掉。

2.二分图最大点权独立集

求一个二分图G的点集,该点集满足两两不连通,最大化点集权值。

引理:二分图独立集与最小点覆盖互补。

因为点权和一定,此时二分图点带权覆盖达到最小值。求二分图点带权最小覆盖即可。

3.最大权闭合子图

求图G的一个点集,该点集满足所有边都连向点集内的边,求点集的最大值。(允许点权带负)。

从最小割的原理出发:首先假设一条边的两个点集都属于一个集合,之后要把两个点分开,一个连s,一个连t。

原问题等价于给定一些二元组,选了 a 就必须选择 b
其次,将原问题转化为最小割问题,原图的边转化为正无穷,那么这条边不可能被割掉,保证了解法的正确性。
考虑先将所有点看做一个集合,因为存在负数,那么就转负为正,并将所有负点连向t点,表示选取该点要付出的代价,同样,对于每个正值点,连向s点,表示舍弃该点损失的价值。先将正权值相加,要最小化总的权值,即求该图最小割(即最少需要减去多少)。

例题:poj2987:Firing

求一个有向图的最大权闭合子图,并输出满足最大权的最小点数方案的个数。

可以证明求出最小割后的残余网络与s相连的点是最小方案(证明略)。

4.矩阵

更加广泛的说,是一类与横纵坐标有关的转化。

poj3041:Asteroids

给一个n*m的矩阵,有些格子有障碍,每次操作可清除整列或整行,求最小切割次数。

将每行看做一个点,每列看做一个点,点值都为1,显然要将这两个点割开,模型同二分图点带权最小覆盖。

bzoj2406: 矩阵

给定一个矩阵A,填充矩阵B,以最小化:

maxmax|iaijbij|max|jaijbij|

要使最大值最小,先二分答案,从而变成了一道判定性问题。

4.最小割的唯一性

ZOJ2587

判定最小割是否唯一。

做法:

如何判定网络的最小割是否唯一?
同样求一次最大流后在残量网络 R 中以正向弧对 s、以正向弧的逆对 t 作 DFS,只不过这次只用一个 flag[i]标记点 i 是否在两次 DFS 中被探访过。最后扫一遍所有点,如果存在没有被探访过的,则说明最小割不唯一。

顺便一提,此时在残量网络上做Tarjan求SCC,会将原图分为S集合,T集合和一堆可以属于S,T集合的SCC,之间被满流边连接,此时就可以搞事了。

BZOJ1797

判断最小割的可行边,必经边。

用到刚才所提的思想,那么直接连接 S,T 的边是必经边,连接任意两个联通块的边是可行边(因为两边可以任意属于一个集合)。

Code:http://paste.ubuntu.com/26116589/

5.图的连通性

Ural1277

每个点拆点求最小割就好了。

6.异或相关

BZOJ2400

好题。题解请看:http://blog.csdn.net/qq_35649707/article/details/78728777

spoj1693

此题同上题,可以参考上题题解。唯一的不同是上题不能改变,这题可以改变,所以要改变从源汇点连边的容量。

你可能感兴趣的:(网络流)