zoukankan      html  css  js  c++  java
  • 【网络流】最大流等于最小割

    【网络流】最大流等于最小割

    将网络流想象成是一张地下水管道的管道图。

    而所有的在管道中流淌的水是起源同一个点,称这个点为源点,而这些水最终都会汇聚于同一点,这个点被称为汇点。

    而每条管道都会有一个容量上限,而这个容量是必然会大于或等于(满载)流经这条管道的实际流量的(就好像杯子只能装不超过杯子容量的水一样)。

    • 流量小于等于容量,容量大于等于流量

      • 推论:

        1. \(\sum_{i=1}^{n}流量i<=\sum_{i=1}^{n}容量i\)

        2. \(\sum_{i=1}^{n}容量i>=\sum_{i=1}^{n}流量i\)

        (流量i和容量i都是一一对应的,都是属于管道i的两个属性)

    不管大小,从源点通过管道流向汇点的水的总量叫做流,而在这些可以的流中,总量最大的叫做最大流。

    而我们不妨规定摧毁一条管道的代价为这条管道的容量,那么我们可以在所有管道中选取一定量的管道进行摧毁的话,并且保证在来自源点的水再也无法流到终点,且在中途过程中就全部泄漏干净了,这样的话就说这是割。

    而注意一下,一侧的管道是可以接受到来自源点的水,而另一侧的管道是虽然是没有有水经过的,但如果是”老鼠“(举个例子)在这些管道中行走,最终还是可以走到终点(汇点)。

    同时规定可以接受到水的点(管道的两端)为集合S,能走到汇点的点为集合T。

    所以,更准确的来讲,割是一个对图的一个划分,而划分的结果会产生两个关于点的集合,且一个割的大小为其砍去所有的边的容量和。而在所有的割里面按大小去挑一个最小的就为最小割

    证明:最大流等于最小割

    证明分三步走

    1. 第一步:任意一个流都小于等于任意一个割。

      就好像杯子只能装不超过杯子容量的水一样

    2. 第二步:构造出一个流等于一个割

      最大流之所以是最大流,可以换某种角度来思考,就是在当前的网络中没有办法再扩充流量了(反证:如果还有,就必然有大于当前状态的流量,而当前状态的流就不应该叫做最大流),而从微观的角度来看,是在这张网络图中,存在一定数量的边,它的流量恰好达到它的容量上限,而不妨,我们可以拿着这些割边去作为割的依据去形成一个割。

      而此时我们就构造出一个等于最大流的一个割。

      \(flow_{max}=cut_k\)

    3. 第三步:

      结合我们已经举出的第一步

      我们有

      \(flow_{max}<=cut_i\),\(cut_i\)为任意一种割

      \(cut_{k}>=flow_i\),f\(flow_i\)为任意一种流

      结合一下,我们有

      \(flow_i<=cut_{k}=flow_{max}<=cut_i\)

      提取部分,会发现

      \(cut_k<=cut_i\)

      因而\(cut_k\)就是所有\(cut\)中最小的,就是最小割,\(cut_k=cut_{min}\)

    因而,最大流等于最小割得证。

  • 相关阅读:
    UML用例图总结
    项目管理心得:一个项目经理的个人体会、经验总结
    UML类图符号简介
    C++中栈和堆上建立对象的区别
    Win32 API
    Python
    remove extra kernel
    Create short cut
    Set Form Position
    Get folder
  • 原文地址:https://www.cnblogs.com/BeautifulWater/p/15609484.html
Copyright © 2011-2022 走看看