zoukankan      html  css  js  c++  java
  • 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的最小割。

  • 相关阅读:
    你应该知道的那些Android小经验
    ArrayList和LinkedList的区别
    Android 监听apk安装替换卸载广播
    关于 Android 进程保活,你所需要知道的一切
    Java Thread 总结
    Android分包原理
    Flask web开发 处理POST请求(登录案例)
    Flask web开发 简单介绍
    编写存储过程导出oracle表数据到多个文本文件
    Linux 特殊符号使用: 倒引号`的使用
  • 原文地址:https://www.cnblogs.com/ihopenot/p/5986772.html
Copyright © 2011-2022 走看看