割的理论在精确算法的研究中占据了中心位置。
首先,我们来谈一下关于割的概念:
如下图所示,蓝色虚线即为一个割,它将整个图分成了两个集合(s和t),显然从图中删除这个割的边后会使整个图不连通
3.最大流和最小割
https://www.bilibili.com/video/BV1Q7411R7ie?from=search&seid=7776388931330246553(空降坐标46:42)
下面讲一下我对割和流的理解:
割的是容量——边上的权值
流的是流量——所有可能路径流经该边的次数
最大流——求出尽可能多的s->t的路径
最小割——划分为S和T集合所要割的边的权值之和最小
我将上图进行详细的展开,得到下图:
上图中s=1,t=5
s->t总共有三种路线分别为:1->2->4->5;1->2->3->5;1->3->5
1->2->4->5:由于2->4只有三条路线可走,所以流量为3,所以从1->2->4->5总共有三条路线走(要求不能重复走一段路)
1->2->3->5:由于1->2->4->5已经用了1->2中的三条路,那么1->2->3->5只有一条路可以走,所以流量为1
1->3->5:由于3->5有四条路线可走,所以流量为4(我认为图上的流量是错的)
由此可得,1->5的最大流=3+1+4=8
而按上图中蓝色虚线割为最小割,最小割=8
由此验证了最大流确实是等于最小割的!
到此,终于可以开始讨论本章的多向割和k-割问题!
一、多向割问题(参考https://blog.csdn.net/qq_41892735/article/details/106834662)
多向割是一个边集合,删除它后会使S中的终点彼此都不连通,多向割问题就是寻找边权和最小的这种集合。
如下图所示:
右图的终点集合为{S1,S2,S3},按照右图的割法,红边即为S2的一个独立割集,删除它后使得S2与S1和S3均不连通。
然后我们发现这并不是权重最小的割集,观察发现下图是最小的割集:
所以,下面给出寻找最小独立割的一个算法(多向割):
1. 对每个i=1,...,k,计算si的最小权独立割,记为Ci.(把S-{si}的所有终点看作是一个独立的节点s,t为si,这样就转化为了计算最小独立割时使用最大流最小割定理,找到最大流也就找到了最小割)
2.丢弃这些割中的一个最重割,然后输出剩余割的并集,记为C(由于把前面k-1个si独立出去之后,最后一个sk自然也被独立了。所以没必要再算上它的割集)
左图中红色的为S1和S2的割集并集,我们发现S3自动就被这俩个割边独立了。
该证明详见《近似算法第36页》
二、最小k-割问题
首先讲一下k-割的概念:移除割边之后,形成了k个连通分支,就是k-割,k-割也是最小割。
k=2时正好为s-t割问题,k≥3时为一个np难问题。
找k-割的算法与多向割算法类似,从G开始,在每个连通分支中计算最小割,然后删除最轻割(保留割的边最多的集合,这样存在的连通分支最多);重复此过程直到存在k个连通分支。
但这个算法证明十分复杂,所以引入一个新概念——Gomory-Hu树(参考https://blog.csdn.net/jyxjyx27/article/details/42750833)
这里只给出结果,过程参见上面的博客
原图G Gomory-Hu树T
所以我们可以发现T是顶点集V上的树,T的边可以不属于E,设e是T的一条边,从T中删除它会产生两个连通分支,设S和S'是这两个分支的顶点集,图G中由划分(S,S’)的割是G中与边e关联的割。
性质:1.对于每对顶点u,v∈V,G中最小u-v割的权与T中的一样
2.对于每条边e∈T,w'(e)是G中与e关联的割的权
我个人理解, Gomory-Hu树上的边全是由每对顶点的最小割边组成,原图有n个顶点这个 Gomory-Hu树就有n-1个边(且是最小u-v割),所以给出 Gomory-Hu树即可求出最小k-割,也就是说只需要求n-1次最小割即可。
我们得到如下算法:
1.计算G的Gomory-Hu树T
2.设C为G中与T的边关联的n-1个割中最轻的k-1个割的并集,输出C
这里我们需要用到下面的引理:
设S是G中与T的l条边关联的割的并集,则从G中删除S后留下的图至少包含l+1个分支。(因为从T中删除l条边,会留下l+1个连通分支,从G中删除会使这l+1个连通分支之间不连通,所以G至少得到l+1个连通分支)
证明参见《近似算法》第38页