最大流和最小割是网络流中的等价问题,并且感觉在实践过程中最大流问题无论因为其直观性,构图的灵活巧妙性,都显示出似乎其价值高于最小割问题。大致看了胡伯涛的这篇论文后,感觉最小割模型也有其很强的技巧性。论文介绍了最大权闭合图,最大密度子图(作者称这部分是精华然而不懂分数规划的我没法深入理解),二分图带点权的最大独立集和最小点覆盖集(互补问题)。
下面谈一下我对这两个问题的理解:
一、最大权闭合图:
闭合图就是一个有向图的子图其中所有点的所有出边都指向该子图中的点。每个点带权,求点权之和最大的闭合子图的权值和。这题让我独立想我基本上不可能想得出比较好的方法。建图方法:源点到所有正权点连容量为点权的边,所有负权点到汇点连容量为点权绝对值的边,原图中边保留在流网络中并将容量设为正无穷(如果不存在正权或负权的点,该问题显然贪心即可)。由于闭合图这个概念的特殊性,可以是一个点出发然后随意走到的点形成的子图,所以和网络流中正无穷的边对应。对于这个网络,有一个很奇妙的性质,它的任意一条割可以划分出一个闭合图(割中只能包含和源点或汇点相连的边),割的值之和等于所有不在子图中的正点的点权之和+所有在子图中的负点的点权的绝对值之和。这样一来,所有正权点的值之和减去割的值,刚好对应在子图中的正点权之和-在子图中的负点权的绝对值之和,即这个子图 的权值(在图上这个性质很显然,也容易证明,但实在想不通是怎么凭空构造出来的)。使权值最大,等价于使割值最小,即求该网络的最小割(最大流)。
二、二分图最小点权覆盖集 / 最大点权独立集
先复习一下点权都是1的最小点覆盖集,这个问题等价于求解二分图最大匹配,通过分析增广路的概念+归纳法可以证明,但是这个过程只能从逻辑上说明问题,不是那么直观。引入网络流求解最大匹配时,通过最小割最大流定理就很好说明问题了。最大匹配=最大流=最小割=最少的属于割边的边数(因为边容量都是1)=最少的覆盖二分图中所有边的点数。而如果点带权,也很好办,将从源点引出的边和流向汇点的边容量设为权值,再求最小割(最大流)即可。但是值得注意的是,网络流求二分图最大匹配时X部和Y部之间连边容量任意,二这里带权覆盖集中X部和Y部之间连边要设为无穷大,这样才能保证最小割不包含XY部之间的边。最大点权独立集就是总点权减去最小割(即最小点权覆盖集),在流网络中也很形象,显然一个点独立集就是所有点减去任意一条割(删去割后的XY部的点之间刚好没有连边了),割越小,独立集的权值就越大。
以上两个问题都用了很重要的一条技巧,就是原图中的边都设为无穷大,这样最小割就不会包含原图中的边从而破坏我们需要利用的一些性质了。
浏览完这篇论文后,我不仅对最小割求解的模型和对策有了更深刻的认识,更重要的是感受到了胡伯涛的严谨的科学精神。我平时在涉及到最大流/最小割的题目时,都是将最大流的模板当成很独立的工具来使用,根本没有想到其中的一些理论知识。胡波涛在论文中讲述最大流的基础概念和算法时,都是用数学语言,通过精确的计算和严谨的证明来一步步地向前推进,而我只是大致知道并仅仅视作工具,没有将它视作一个有着自己体系的学科分支,这样在理论基础上就和别人有差距了,感觉自己确实太鄙陋。在以后的学习以至于生活中,应该更加地追求一些刨根问底的精神,而不能肤浅地停留在表面。
这让我想起今天CSDN首页有一句话挺有意思,“有编过程的人的代码,比那些无知的人使用的软件更有价值”,这虽然只是程序猿们无聊的吐槽或者自我心理安慰,但仔细一想,对OI的学习也很有意义。我每次都是直接用成型的模板代码,就相当于“无知的人使用软件”,而那些大神们都非常重视和擅长理论推导,正是相当于真正“编过程的人的代码”。