zoukankan      html  css  js  c++  java
  • 上下界网络流构图证明

    对于上下界网络流,以前只会建图,不会证明,今天我算是会证了。
    (头一次证明图论啊,耶!)


    众所周知,网络流的一条可行流必须满足两个条件:流量守恒容量限制
    我们记有向图(G)的一条从(u)(v)的边的容量为(c(u, v)),流量为(f(u, v)),那么上述连个条件就可以形式化的写成:

    [sum _{u, i in G} f(u, i) = sum _ {i, v in G} f(i, v)$$$$f(u, v) leqslant c(u, v) ]

    现在每条边多了一个下限(b(u, v)),然后就有了这两种题型:求解可行流求解最大最小流
    以下我将分别证明这个图是怎么建的。


    求解可行流
    首先(b(u, v) leqslant f(u, v) leqslant c(u, v)),但因为网络流中只能体现流量非负,因此可以写成(f(u, v) = b(u, v) + g(u, v)),其中(g(u, v) geqslant 0)
    根据流量守恒,有

    [egin{align*} sum _ {u, i in G} f(u, i) &= sum _ {i, v in G} f(i, v) \ sum _ {u, i in G} b(u, i) + g(u, i) &= sum _ {i, v in G} b(i, v) + g(i, v) \ sum _ {u, i in G} g(u, i) - sum _ {i, v in G} g(i, v) &= sum _ {i, v in G} b(i, v) - sum _ {u, i in G} b(u, i) end{align*}]

    (M(i) = sum _ {i, v in G} b(i, v) - sum _ {u, i in G} b(u, i))
    (M(i) geqslant 0) 时,有

    [sum _ {u, i in G} g(u, i) = [sum _ {i, v in G} g(i, v)] + M(i) ]

    新建一个附加汇点(t),连一条新边(c'(i, t) = M(i)),就保证流量守恒了。
    (M(i) < 0)时,有

    [[sum _ {u, i 'in G} g(u, i)] - M(i) = sum _ {i, v in G} g(i, v) ]

    新建一个附加源点(s),从(s)(i)连一条边(c'(s, i) = -M(i))


    这样我们通过补充流量的方法把图建完了。
    能看出,原图存在可行流的情况必须满足对于任意一个(i)(g(s, i), g(i, t))都满载。
    这样我们从附加源跑最大流,然后看这些出边是否都满载即可。
    实际上不用依次判断附加源的出边,只用看到附加汇的流量是否为附加源出边的容量之和,因为根据这种建图的对称性,有(sum c'(s, i) = sum c'(i, t))


    上面讲的是无源汇可行流,对于有源汇的,只要在原源汇点加一条(c'(t_0, s_0) = [0,INF])的边就变成无源汇了。


    求解最大最小流
    方法和就是转化成循环流,在有解的前提下分情况。
    问题是自己只能口糊了,全网都没有什么证明……
    1.求最大流。
    一种做法是把(c'(t_0, s_0))这条边删掉,然后这次从(s_0)跑一边最大流,答案就是两次从(s_0)(t_0)的最大流量之和。
    另一种做法是不删边,直接跑,那么答案就是这次的(s_0)(t_0)的流量。


    2.求最小流。
    判完可行流之后,如果直接从(t_0)跑一边最大流进行退流的话,可能会超出下限。因此我们要删去所有和附加源汇相连的边和((s_0, t_0))这条边,相当于把这些补上去的流量给固定住了,这时候在退流,就能得出正确的最小流了。
    但是关于最小流,我在网上看到了n多种方法,各不相同但却都挺有道理。自己也试了一些,有些行得通有些行不通。不过为了防止自己记混,别的方法这里就不讲了。

  • 相关阅读:
    devenv.exe与devenv.com
    [LeetCode 132] 回文分割II(Palindrome Partitioning II)
    [翻译]More C++ Idioms 取址器(Address of)
    [LeetCode 131] 回文分割(Palindrome Partitioning)
    [翻译]More C++ Idioms 类成员检测器
    C++类的隐式默认构造函数
    [翻译]More C++ Idioms 通过初始化挂接(Attach by Initialization)
    【转】来自微软的纯CSS下拉菜单
    引用asp.net母版页后,母版页和内容页的页面事件执行顺序
    如何解决无法显示隐藏文件/文件夹
  • 原文地址:https://www.cnblogs.com/mrclr/p/10764466.html
Copyright © 2011-2022 走看看