• Stoer-Wagner算法学习笔记


    SW算法是求全局最小割的一种O(n^3)算法,虽然可以用堆优化到O(n^2logn),但在稠密图上效果好像并不太好。

    算法流程 :
    1)设图G的min_cut=INF

    2)设集合A为空集,w为累计权,随机选一个节点s,将s加入A,将所有与s相连的点i的wi加上s->i的边权

    3)选出一个w值最大的不在A中的节点j加入s,将所有与j相连的点i的wi加上j->i的边权

    4)如果|A|不等于|G|,执行3)

    5)设最后加入的点为t,倒数第二个点为s,则s-t最小割为ws,用ws更新min_cut

    6)将s,t缩成一个点,边也叠加到一起

    7)如果|A|!=1,执行2),否则返回min_cut

    自己看了下网上的证明,大多都是丢的paper,英文太渣看不懂。。。QAQ

    然后自己就着自己的理解脑补了一下,说错别打我QAQ

    首先我们考虑任意两个点为s,t,如果全局最小割中s,t不在一个集合中,那么显然全局最小割即为s-t最小割。否则我们将s,t缩成一个节点对于答案是没有影响的。

    SW算法就是基于这一点,每次将问题规模减小后求解。以上还是很好理解的,但是为什么那样扩展节点就能保证是最小割呢?

    我的理解是,一开始选择的节点是作为s-t的中间节点集,因为每次扩展是选取联系度最大的点扩展,所以中间节点集中点互相间的联系度是大于st到中间点集的联系度的,而最后加入的点t的联系度是最小的,所以最小割即为这个点的联系度,即为s通过中间节点集到t的流量加上s直接到t的流量。所以就证明了每次拓展求出的是s-t的最小割。

  • 相关阅读:
    ImageWatch 无法安装在VS2017环境下的解决方案
    Android CmakeList
    Android 工程越来越大,运行变卡解决方法
    奥卡姆剃刀(简约之法则)
    Cmake时 如何在windows命令行 选择vs版本
    ubuntu 18.04 安装tensorflow 2 cuda10 CUDNN Anaconda3
    Centos7简易通过yum安装phpmyadmin
    centos7 nigx 免费永久获取 Let‘s Encrypt 证书
    Execution failed for task ':app:compileDebugJavaWithJavac'
    centos 安装aconda
  • 原文地址:https://www.cnblogs.com/ihopenot/p/5986772.html
Copyright © 2020-2023  润新知