最小割专辑

一、基本问题:

1.到底什么是割:原始点集为V,选出一些点集S使得s∈ST=V-St∈TST的边为ST,记做[S,T]

2.什么是最小割:图中所有的割中,边权值和最小的割为最小割!

3.割得容量容量和流量计算的区别:割[S,T]的容量为∑((u,v)的容量和),其中u∈S,v∈T。也就是说割的容量不计算反向的边!!而流量为正向的和反向的代数和。

4.最大流-最小割定理:最大流的值为最小割的容量!

5.怎样求割:求完最大流后,在残留网络中从source开始dfs,被染色的为S,未被染色的为T,则边集[S,T]为割。

二、一些割的性质:

1.[S,T],流量只能从S流向T,不能从T流向S!(在最大流后找割dfs时其实就满足这个性质,假设T中一个点v流向S中的一个点u,那么uv有负流量,uv的残留网络严格大于0。反向dfs证明类似

2.最大流后,割边一定满流。减小某一割边后,网络流减小。

3.如下图,从s沿着残余流量dfs,得到点集S;同理沿着t反向dfs,得到点集T;剩下的是M。分界线cut1cut2是其中一割,边自然为割边。然而在M中还存有割边(一定存有!!否则M就没用了!)


4.退化一下:如下图所示,ST有相邻部分边集E1SM重合边集相邻部分边集E2MT相邻边集部分E3,那么直接升高E1中某条边的容量,会使整体容量直接增高!反之:而如果增大SM相邻的割边或者MT相邻的割边,网络流不直接增大,因为M中还存有割边限制


5.继续退化:如果M==空集,cut1cut2重合(变为cut),则网络中割唯一。可以通过 if ( |S|+|T|==总点数来判断

 

三、割的三个典型应用(参考《最小割模型在信息学竞赛中的应用》):最大权闭合图、最大密度子图、二分图的最小点权覆盖(二分图的最大点权独立集)

poj 3468 Dual Core CPU

题意:给出不同模块在两个cpu工作各自的耗费和某些模块若不在同一CPU运行的耗费,求合理安排各个模块的最小耗费

解法:最大流=最小割,st分别代表两个cpu,耗费作为cap
证明:每个顶点都与源点和汇点相连,即每个模块都可在任意一个CPU中工作,对于图中的任意割,源点和汇点必不连通,因此每个模块都不可能同时在两个CPU中运行,此时的耗费为割的容量。

poj 1815  Friendship
题意:给出一些人之间的通话关系,如果A能跟B联系,B能跟C联系,那么A能跟C联系,求删除最少的人,然给定的两个点S、T断了联系,如果存在被删除的店,要求输出字典序最小的。就是编号小的优先。

思路:每个点i拆为i和n+i,(i,n+i)间流量为1,确保每个人只被删除一次。如果(i,j)之间有通话关系,则(i+n,j)间流量为1,源点和s间流量为inf,t和汇点间流量为inf,s、t与自己拆点间流量为inf。输出最小割很容易,关键是按字典顺序输出割边。每次从小到大消掉每一个点(让拆点后的边容量为0),然后再次求最大流,如果此次不等于上次最大流,则此边为割边,输出;否则,将消除的点恢复。

注意:0和No Answer的区别:如果s与t直接连通则No Answer;如果s与t之间没有任何连接则为0(最大流为0);


poj 3084 Panic Room

题意: 有N个房间并有一间是需要保护的,另外有一些房间有恐怖份子要进入该房间。房间与房间有门(有可能多个门),门有锁,锁是只能一边能控制,一但锁上门,另一边不可进入。要防止保护的房间被侵入,因此需要锁上有些门,求最少要锁多少个门。

构图:对于每把锁,如果能从a房间锁住并且连通b房间,则(a,b)容量inf(b,a)容量+1,将源点与所有有入侵者的房屋间连一条容量为inf的边,最小割值即为答案(证明:割后所有有入侵者的房间不与需要保护的房间在一个集合中,对于每把锁,不能够从入侵者一侧控制则容量为1,否则为inf即此锁对入侵者失效,因此若最小割>=inf 则说明无论关多少门都不能奏效)


ZOJ 2587Unique Attack
判断最小割是否唯一,
由上述5的性质知求得最大流之分别从起点和终点延残余网络dfs,若能够遍历所有的点则最小割是唯一的。


poj2914 Minimum Cut

描述:无向图的最小割stoer-wagner算法(不指定source, sink

Stoer-Wagner算法

求解无向连通图的最小割(不指定sourcesink),O(V^3)。据说 枚举 网络流必然tle

思路:类似prim算法,求最大生成树,树种最后一个点v与他的前驱pre[v]合并为pre[v](也就是pre[v]的流量加上了v的流量就行了),这样进行V次就可以了。而ans为每次最大生成树后的ans = min(ans, E[pre[v]][v])

技巧:

1.用模拟指针比较好控制缩点。

2.prim的区别:每次生成树并不是从新找最大边,而是在上一次松弛的基础上,找出最大边。也就是说松弛与选最大边合并了

3.由于2,没必要用堆了


poj 2987 Firing 最大(点)权闭合图

poj3155 Hard Life


博客搬新家:sensirly.github.io
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值