上下界网络流构图证明

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


众所周知,网络流的一条可行流必须满足两个条件:流量守恒容量限制
我们记有向图\(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\)
根据流量守恒,有

\[\begin{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多种方法,各不相同但却都挺有道理。自己也试了一些,有些行得通有些行不通。不过为了防止自己记混,别的方法这里就不讲了。

posted @ 2019-04-24 22:43  mrclr  阅读(223)  评论(0编辑  收藏  举报