Stoer-Wagner算法求全局最小割

Stoer-Wagner算法求全局最小割

全局最小割可以用网络最大流来实现,也可以用Stoer-Wagner实现


先看几个概念

  • S−T割:使得顶点S与顶点TT不再连通的割,称为S−T割
  • S−T最小割:包含的弧的权和最小的S−T割,称为S−T最小割。
  • 全局最小割:包含的弧的权和最小的割,称为全局最小割。
  • 诱导割(induced cut):令图G=(V,E)的一个割为C,则割C在图G的子图G′=(V′,E′)中的部分称为割CC的诱导割

再看两个事实

  1. 两个顶点s,t 要么在全局最小割的一边,要么在两边,若s,t在全局最小割的两边,那么全局最小割就是S-T最小割
  2. 若s,t是位于全局最小割的两边,那么s,t合并成一个一点之后(不仅仅将两个点合并,相关的边也要合并)全局最小割变大(反证)

先看一下算法流程,然后再看证明。

  1. 初始化最小割 M I N = i n f MIN = inf MIN=inf
  2. 选一个初始点 a a a,加入集合 A A A中,也就是 A = { a } A=\{a\} A={ a}
  3. 设V为图中全部的节点,选择节点 x x x满足 a r g m a x x ∑ y w ( x , y ) x ∈ ( V − A ) , y ∈ A \underset{x}{argmax} \sum_yw(x,y)\quad x\in (V-A),y \in A xargmaxyw(x,y)x(VA),yA然后将 x x x加入到 A A A中,,重复此过程,直到 ∣ A ∣ = ∣ V ∣ |A|=|V| A=V
  4. 选择倒数第二个和倒数第一个加入到 A A A中的节点记作 s 、 t s、t st,最后求得的 ∑ x ∈ A w ( t , x ) \sum_{x \in A}w(t,x) xAw(t,x)就是 s − t s-t st最小割**(\默认是这样,一会儿证明 )**,令 M I N = m i n ( M I N , ∑ x ∈ A w ( t , x ) ) MIN = min(MIN, \sum_{x \in A}w(t,x)) MIN=min(MIN,xAw(t,x))(注意此时 ∑ x ∈ A w ( t , x ) \sum_{x \in A}w(t,x) xAw(t,x)已经在第三步求出),合并s,t,返回步骤2直到 ∣ V ∣ = = 1 |V|==1 V==1,也就是没有节点可以合并为止。
  5. 最后输出MIN,也就是最后的结果

那么我们此时注意我们的第5步,我们不管此时的 s − t s-t st最小割 ∑ x ∈ ( A − V ) w ( x , t ) \sum_{x \in (A-V)}w(x,t) x(AV)w(x,t)是不是全局最小割 (我们上面说过,若两个顶点s,t 要么在全局最小割的一边,要么在两边,若s,t在全局最小割的两边,那么全局最小割就是S-T最小割),如果不是的话,我们合并,如果是的话我们此时已经找到了,操作 M I N = m i n ( M I N , ∑ x ∈ A w ( t , x ) ) MIN = min(MIN, \sum_{x \in A}w(t,x)) MIN=min(MIN,xAw(t,x))便得到这个值,然后我们的算法会仍然合并 s 、 t s、t st,根据事实2,我们直到接下来找的值一定不会比他小。

那么我们下面需要考虑的问题是我们步骤4当中这句话求得的 ∑ x ∈ A w ( t , x ) \sum_{x \in A}w(t,x) xA

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值