无向图最小割的相关算法及其延伸

无向图最小割的相关算法及其延伸

这个题目实在太大了,因为这是一个研究了许多年发表了无数篇文章的问题,我自然也无法在短期内很好的诠释它。但为了与网上的其它文章有所区别,我打算把几个内容都揉到文章中去,但是这些都似乎在ICPC中尚无用武之地,就权当是爱好吧。
网络流算法自然是可以解决该问题,但是我们不作讨论。还有一类方法是90年代初期发展起来以缩图(Contraction algorithm)为基础的算法,目前最简单最高效的stoer-wagner算法是1997年发表的,它的主要思想如下:

定理1 对于图中任意两点s和t,它们要么属于最小割的两个不同集中,要么属于同一个集。
如果是后者,那么合并s和t后并不影响最小割。基于这么个思想,如果每次能求出图中某两点之间的最小割,然后更新答案后合并它们再继续求最小割,就得到最终答案了。
怎么完成求图中任意两点之间的最小割呢?不能借助网络流算法,否则我们说那么多就完全没有意义了。索性我们来个革命性的举动,对G做Maximal Adjacent Search,具体过程如下:
1.任选一个点s到集合A中,定义W(A, p)为A中的所有点到A外一点p的权总和;
2.对刚才选定的s,更新W(A,p)(该值递增);
3.选出A外一点p,且W(A,p)最大的作为新的s,弱A != G(V),则继续2。

我们把最后进入A的两点记为s和t,那么W(A,t)就是s和t的最小割的值了(后面为方便,把W(A,t)记为C)。做完这一步,就把s 、t合并了,于是图中又少了一点,然后重复,直到图中只有一个点位置,所以一共做了n – 1个phase,每做一次花费O(n^2),所以一共是O(n^3)(当然,这个过程很象是个prim,所以对于稀疏图,可以用fibnacci堆把搞到 O( m + nlgn ),而我是假设它是一个密图)。
还是继承我一贯的风格,对于这种论文上有的东西我不会给予证明,大家可以去搜stoer-wagner算法的原文来参考。
接下来,既然已经找到s-t最小割了,那能否快速构造出以它们为源汇的最大流呢?观察到实际上上面求得的最小割就是把所有于t相连的边都割掉,也就是说这些边最后都会被充满;s-t之间的边和为c,于是先将最大流变为C = C-c,去掉这些边,再按下面的步骤来做:
1.将图中每个点v的编号映射到它进入A的名次,如t -> n,s -> n – 1;
2.把图中每条边有向化:对于边e的两端点u、v,如果u > v,那么e化为 u -> v;
3.对图中每个点v,将v的所有出边按另一个端点的编号从大到小排序;
4.把t的所有边预先充满;对s边,按照刚才排序的顺序,尽量把C分配上去;
5.算法从v = n – 2开始执行下面的过程;
6.对于v的所有入边,记Fs为进入v的流量,Ft为流出v的流量,如果Ft >= Fs,那么到7继续,否则将Fs – Ft的流量像源一样把分配到出边中;
7.v = v – 1,如果 v = 0 那么到过程结束,否则到6继续。
上面算法的证明非常巧妙,几乎就和stoer-wanger算法一样有创造性,非常值得学习。而该算法的复杂度仅仅是O(m),所以每次求了s-t割后再附带求个最大流并不会改变算法的总复杂度,非常优秀。

在最小割算法研究中,其实Monte-Carlo 算法占了相当的比例,Karger–Stein算法是其中的代表。它与stoer-wagner算法的区别就是不作那个最大领接搜索,仅仅依赖于定理1, 每次从边集中随机选一条来合并,直到图中只有两个点为止。这样一个思路是很简单的,但它们对于该算法的正确性分析却是令人兴奋的,首先有如下定理:

定理2 任何一个图的最小割个数不超过C(n, 2)。

也就是说该算法能成功的概率是1/n^2,因此只要随机次数达到O(n^2),成功率就相当可观了。
值得一提的是,这是随机算法中一个经典设计的案例,因为定理1最早就是由Karger提出并证明的,而后在95年提出了上面的算法,在97年它们又对该算 法做了改进(思路不复杂,但是空间耗费比较大,所以略过),而此时stoer-wagner刚刚问世(据我所知该论文94年在欧洲某会议发表了,但是97 年在ACM发表后才扩大了其影响力)。
另外,其实很多有效的方法来提高找min-cut的效率的,比如有名的PR Heuristic系列就是用来进行启发式判断,这些大家可以去网上找找。
就介绍这么多,相信本文除了提醒你有许多神奇的东西外,你是没有学到什么的,所以还是看论文吧。

 

(转载:http://richardxx.yo2.cn)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值