网络流相关学习笔记

一些概念

网络与流

流网络(简称网络)\(G = (V, E)\)是一个有向图, 每条边\(\langle u, v \rangle \in E\)均有一非负容量\(c(u, v) \ge 0\). 同时我们规定假如\(\langle u, v \rangle \notin E\), 则有\(c(u, v) = 0\). 网络中有两个特殊点: 源\(s\)与汇\(t\).

网络\(G\)是一个实质函数\(f : V \times V \to R\), 要求其满足如下三个性质:

  • 容量限制: \(\forall u, v \in V\), 要求\(f(u, v) \le c(u, v)\)
  • 反对称性: \(\forall u, v \in V\), 要求\(f(u, v) = - f(v, u)\)
  • 流守恒性: \(\forall u \in V - \{s, t\}\), 要求\(\sum_{v \in V} f(u, v) = 0\)

我们称\(f(u, v)\)\(u\)\(v\)的流.

整个网络的流的定义是:

\[|f| = \sum_{v \in V} f(s, v) \]

一个网络中的最大流, 就是指网络中流值最大的流.

下文中的函数求和上, 采用隐含求和记号, 即

\[f(X, Y) = \sum_{u \in X} \sum_{v \in Y} f(u, v) \]

引理1.1: 假设\(f\)是网络\(G = (V, E)\)中的一个流, 则有

  • \(\forall X \subseteq V\), 有\(f(X, X) = 0\). 证明: 反对称性.
  • \(\forall X, Y \subseteq V\), 有\(f(X, Y) = - f(Y, X)\). 证明: 反对称性.
  • \(\forall X, Y, Z \subseteq V\), 其中\(X \cap Y = \emptyset\), 有\(f(X \cup Y, Z) = f(X, Z) + f(Y, Z)\). 证明: 直接展开即可.

残留网络与增广路径

对于\(G\)中每条边\(\langle u, v \rangle \in E\), 我们定义其残留容量

\[c_f(u, v) = c(u, v) - f(u, v) \]

残留网络的定义为: 给定网络\(G = (V, E)\)与流\(f\), 残留网络为\(G_f = (V, E_f)\), 其中边集

\[E_f = \{ (u, v) \in V \times V | c_f(u, v) > 0 \} \]

下面的引理给出了残留网络与原网络的关系:

引理1.2: 设\(f\)\(G = (V, E)\)中的一个流, \(f'\)是其残留网络\(G_f\)的一个流, 则\(f + f'\)仍然是\(G\)的一个流.

证明: 我们考虑流的三个性质:

  • 在残留网络中, \(f'(u, v) \le c_f(u, v)\), 又由于\(c_f(u, v) = c(u, v) - f(u, v)\), 因此\(f'(u, v) \le c(u, v) - f(u, v)\), \(f(u, v) + f'(u, v) \le c(u, v)\), 因此满足\(G\)的容量限制.
  • 在残留网络中, 我们有\(f'(u, v) = - f'(v, u)\), 又因为在原网络中, \(f(u, v) = - f(v, u)\), 因此\(f(u, v) + f'(u, v) = - f(v, u) - f'(v, u)\), 因而满足反对称性.
  • 在残留网络中, \(\forall u \in V - \{s, t\}\), 有\(\sum_{v \in V} f'(u, v) = 0\); 在原图中, \(\forall u \in V - \{s, t\}\), 有\(\sum_v \in V f(u, v) = 0\), 因此有\(\forall u \in V - \{s, t\}\), \(\sum_{v \in V} f(u, v) + f'(u, v) = 0\). 因此满足流守恒性.

综上, 由于\(f + f'\)\(G\)中满足流的三个性质, 因此\(f + f'\)仍然是\(G\)的一个流.

增广路径\(p\)为残留网络\(G_f\)\(s\)\(t\)的一条简单路径. 该路径的容量为:

\[c_f(p) = \min\{ c_f(u, v) | \langle u, v \rangle \in p \} \]

并且我们要求\(c_f(p) > 0\).

引理1.3: 我们定义流\(f_p\)

\[f_p(u, v) = \begin{cases} c_f(p) & \langle u, v \rangle \in p \\ - c_f(p) & <v, u> \in p \\ 0 & else \end{cases} \]

\(f_p + f\)仍然是\(G\)的一个流.

证明: 首先我们需要证明的是在这种定义下的\(f_p\)\(G_f\)上一个合法的流. 我们假设\(\langle u, v \rangle \in P\), 则有

  • \(\because c_f(p) = \min\{ c_f(u, v) | \langle u, v \rangle \in p \}\therefore f_p(u, v) = c_f(p) \le c_f(u, v)\). 因而满足流量限制.
  • \(\because \langle u, v \rangle \in P \therefore f_p(v, u) = - c_f(p) = - f_p(u, v)\). 因而满足反对称性.
  • 我们假设\(x\)\(p\)上不为\(s\)\(t\)的一个节点, 并且\(<y, x> \in p\)\(<x, z> \in p\), 则有\(f_p(x, y) = - c_f(p)\), \(f_p(x, z) = c_f(p)\), 因此\(\sum_{v \in V} f_p(x, v) = f_p(x, y) + f_p(x, z) = 0\). 因而满足流守恒性.

既然\(f_p\)\(G_f\)上一个合法的流, 那么根据引理1.2, \(f_p + f\)\(G\)上一个合法的流.

最大流与最小割

网络\(G = (V, E)\)\([S, T]\)将点集\(V\)分为了\(S\)\(T\)(\(T = V - S\))两个部分, 使得\(s \in S\)\(t \in T\). 一般地, 我们所说的割\([S, T]\)还指一个边集\(\{ \langle u, v \rangle | \langle u, v \rangle \in E, u \in S, v \in T \}\). 我们定义穿过\([S, T]\)净流\(f(S, T)\), 割\([S, T]\)容量定义为\(c(S, T)\). 一般我们将其记为\(c[S, T]\). 一个网络的最小割为该网络中容量最小的割.

引理1.4: 在一个网络\(G = (V, E)\)中, 设任意一个流为\(f\), 且\([S, T]\)\(G\)一个割, 则通过割的净流为\(f(S, T) = |f|\).

证明:

\[\begin{aligned} f(S, T) &= f(S, V) - s(S, S) \\ &= f(S, V) \\ &= f(s, V) + f(S - \{s\}, V) \\ &= f(s, V) + \sum_{u \in S - \{s\}} \sum_{v \in V} f(u, v) \\ &= f(s, V) \\ &= f \end{aligned} \]

推论1.5: 在一个网络\(G = (V, E)\)中, 设其任意一个流为\(f\), 任意一个割为\([S, T]\), 必有\(|f| \le c[S, T]\).

证明: 根据容量限制, 有

\[|f| = f(S, T) = \sum_{u \in S} \sum_{v \in T} f(u, v) \le \sum_{u \in S} \sum_{v \in T} c(u, v) = c[S, T] \]

定理1.6: 如果\(f\)是具有源\(s\)和汇\(t\)的网络流\(G = (V, E)\)中的一个流, 则下列条件是等价的:

  • \(f\)\(G\)的一个最大流
  • 残留网络\(G_f\)不包含增广路径
  • \(G\)的某个割\([S, T]\), 有\(|f| = c[S, T]\)

证明:

(1)\(\Rightarrow\)(2): 反证法: 假如\(f\)\(G\)的一个最大流, 但残留网络\(G_f\)中包含一条增广路径\(p\), 则\(f + f_p\)仍然为\(G\)的一个流, 其值大于\(|f|\), 与条件矛盾. 因此得证.

(2)\(\Rightarrow\)(3): 注意到\(G_f\)中不包含增广路径, 即\(G_f\)中不存在\(s\)\(t\)的路径, 因此我们另

\[S = \{ v \in V | \exists p_{x, v} \in G_f \} \]

其中\(p_{s, v} \in G_f\)表示在\(G_f\)存在一条从\(s\)\(v\)的通路, 且\(T = V - S\). 这样得到的划分\([S, T]\)就是一个割. 由于不存在\(s\)\(t\)的路径, 因此\(t \notin S\); 同时\(\forall u \in S, v \in T\), 有\(f(u, v) = c(u, v)\). 又由于引理1.4, 因而有\(|f| = f(S, T) = c[S, T]\).

(3)\(\Rightarrow\)(1): 根据推论1.5可知, \(\forall |f|\)\(|f| \le c[S, T]\), 又由于\(|f| = c[S, T]\), 因此\(f\)\(G\)的最大流.

我们把容量最小的割\([S, T]\)称为网络\(G\)的最小割.

定理1.6告诉我们一个重要的信息: \(c[S, T] = |f|\).

最小割算法与最大流算法

略.

分数规划

之前已经大概写过了. 略.

基于定义的直接应用

网络战争

Description

给定一个带权无向图, 每条边\(e\)有一个权值\(w_e\). 求将\(s\)\(t\)分开的一个割边集\(C\),使得\(C\)的平均权值\(\lambda\)最小.

Solution

分数规划.

我们二分\(\lambda\), 并尝试在\(G\)中找到一个割\(C\)使得

\[\sum_{e \in C} w_e - \lambda \le 0 \]

我们把每条边的权值替换为\(w_e - \lambda\), 考虑到有一些边的权值\(< 0\), 我们直接将这些边加入\(C\)中, 并在原图中将其去除; 接下来跑最小割即可.

最优标号

Description

我们给定一个无向图\(G = (V, E)\), 每个点\(v\)有一个有上界非负整数作为标号\(l_v\), 每条边\(e = (u, v)\)的权值定义为\(l_u \oplus l_v\). 已知图中部分点的标号, 求该图中所有边权之和最小是多少.

Solution

首先考虑不存在有标号的点的连通块: 我们可以直接把这些点的标号设为0, 则不需要统计答案了.

考虑如何处理\(\oplus\)运算. 我们对每个标号进行二进制拆分, 依次处理每个二进制位. 这样一来, 标号就只有0和1两种了.

我们考虑如何用最小割表示出异或运算: 从\(s\)向所有确定标号为\(0\)的点连一条容量为\(+ \infty\)的边; 从所有确定标号为1的点连一条容量为\(+ \infty\)的边向\(t\); 原图中相连的点用容量为\(1\)的双向边连接. 跑一遍最小割, 即可得到当前位的最小边权之和.

最大权闭合图

引入

我们定义有向图\(G = (V, E)\)闭合图是该有向图的一个点集, 且该点集的所有出边都还指向该点集.

最大权闭合图是一个点权之和最大的闭合图.

构造

考虑如何将\(G\)转化为网络\(N = (V_N, E_N)\), 从而利用最小割模型.

我们在原图的基础上增加源\(s\)和汇\(t\), 将原图中每条有向边的容量定为\(+ \infty\); 从源点\(s\)向每个权值为正数的点连一条容量为该点权值的边; 从每个权值为负数的点向汇点连一条容量为该点权值的绝对值的边. 令\([S, T]\)\(N\)的最小割, 则\(S\)即为\(G\)的最大权闭合图.

更形式化地, 对于网络\(N\), 我们有

\[V_N = V \cup \{s, t\} \\ E_N = E \cup \{ \langle s, v \rangle | v \in V, w_v > 0 \} \cup \{ \langle v, t \rangle | v \in V, w_v < 0 \} \\ \begin{cases}{} c(u, v) = \infty & \langle u, v \rangle \in E \\ c(s, v) = w_v & w_v > 0 \\ c(v, t) = - w_v & w_v < 0 \end{cases} \]

证明

我们定义简单割为满足割中每条边只都与源\(s\)或汇\(t\)相连的一个割. 根据该定义, 本问题中网络\(N\)的简单割是不包含原图的边集\(E\)中任何边的.

引理3.1: 本问题的网络\(N\)中, 最小割是简单割.

证明: 最小割不可能取任何权值为\(\infty\)的边, 因此最小割中不存在\(E\)中的边. 因此最小割即为简单割.

我们首先规定一些符号. 我们设简单割\([S, T]\)将网络\(N\)的点集\(V_N\)划分为点集\(S\)及其补集\(T = V_N - S\), 满足\(s \in S\)\(t \in T\). 设闭合图为\(V_1\), 它在\(V\)中的补集为\(\overline{V_1}\)\(V_2 = V - V_1\), 设\(V^+\)\(V\)中权值为正的点集, \(V^-\)\(V\)中权值为负的点集.

引理3.2: 网络\(N\)的简单割\([S, T]\)与图\(G\)的闭合图\(V_1\)方案存在一一对应关系: \(V_1 \cup \{s\} = S\).

证明:

(1) 闭合图对应简单割. 即\(S = V_1 \cup \{s\}\), \(T = \overline{V_1} \cup \{t\}\), 求证\([S, T]\)为简单割.

首先由于\([S, T]\)\(V_N\)的一个划分, 因而它是一个割.

然后用反证法. 反设存在\(\langle u, v \rangle \in E\), 满足在\(N\)\(u \in S - \{s\} = V_1\), \(v \in T - \{t\} = \overline{V_1}\), 使得\([S, T]\)含不与源或汇相连的边. 则闭合图\(V_1\)有一个后继不在闭合图内. 矛盾.

(2) 简单割对应闭合图. 即\(V_1 = S - \{s\}\)是闭合图.

\(\forall u \in V_1\), 考虑所有由\(u\)引出的出边\(\langle u, v \rangle \in E\), 由于简单割不含\(E\)中任何边, 因而\(v \notin T - \{t\} = \overline{V_1}\), 即\(v \in V_1\), 符合闭合图的定义.

引理3.3:

\[c[S, T] = \sum_{v \in V_2^+} w_v + \sum_{v \in V_1^-} (- w_v) \]

证明: 我们把\([S, T]\)分为以下3部分

\[[S, T] = [\{s\}, V_2] \cup [V_1, \{t\}] \cup [V_1, V_2] \]

又由于\([S, T]\)为简单割, 因而\([V_1, V_2] = \emptyset\)

由于\(s\)只与正权点有连边, 因而\([\{s\}, V_2] = [\{s\}, V_2^+]\)

同理, \([V_1, \{t\}] = [V_1^-, \{t\}]\)

因此原式成立.

引理3.4: 当\([S, T]\)\(N\)中最小割时, 其对应的图\(G\)的闭合图达到最大权.

这个很简单, 闭合图的权值等于所有的正权减去不选的正权减去选了的负权. 我们让减去的值最小, 也就是说割边的权值之和最小即可.

所以这种做法求最大全闭合图的正确性就证明完毕了.

应用

Description

ADN 公司得到了一共 n 个可以作为通讯信号中转站的地址。由于这些地址的地理位置差异,在不同的地方建造通讯中转站所需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第\(i\)个通讯中转站需要成本 \(p_i\) 。另外公司调查得出了所有期望中的用户群,一共\(m\)个。第\(i\)个用户群的用户会使用中转站\(a_i\)和中转站\(b_i\)进行通讯,公司获益\(c_i\)。ADN公司可以有选择地建立一些中转站(其成本之和为总成本),为一些用户提供服务并获得收益(收益之和为总收益)。那么如何选择最终建立的中转站才能让公司的净获利最大呢?(净获利 = 总收益 - 总成本)

Solution

我们将每个顾客建为一个点, 权值为\(c_i\). 每个顾客\(i\)连向\(a_i\)\(b_i\), 跑最大权闭合子图即可.

二分图的最小点权覆盖与最大点权独立集

引入

点覆盖集是无向图\(G\)的一个点集, 使得该图中所有边都至少有一个端点在该集合内. 即, 点覆盖集为\(V' \in V\), 满足\(\forall (u, v) \in E\)都有\(u \in V'\)\(v \in V'\)成立.

独立点集是无向图\(G\)的一个点集, 使得任意两个在该集合中的点在原图中都不相邻. 即, 独立点集为\(V' \in V\)满足\(\forall u, v \in V'\)都有\(\langle u, v \rangle \notin E\).

最小点覆盖集是指在无向图\(G\)中, 点数最少的点覆盖集.

最大点独立集是指在无向图\(G\)中点数最多的点独立集.

二分图的最小点权覆盖

给定一个二分图\(G = (V = X \cup Y, E)\), 每个点有点权\(w_u\), 要你找到一个点集\(V' = X' \cup Y'\), 使得\(\forall \langle u, v \rangle \in E\)满足$u \in \(或\)v \in V\(, 且\)\sum_{u \in S} w_u$有最大值.

考虑如何将这个问题转化为最小割模型: 我们令网络\(N = (V, E)\), 且

\[V_N = V \cup \{s, t\} \\ E_N = E \cup \{ \langle s, u \rangle | u \in X \} \cup \{ \langle v, t \rangle | v \in Y \} \\ \begin{cases}{} c(u, v) = \infty & \langle u, v \rangle \in E \\ c(s, u) = w_u & u \in X \\ c(v, t) = w_v & v \in Y \end{cases} \]

定理5.1: 网络\(N\)的简单割\([S, T]\)与图\(G\)的点覆盖集\(V'\)存在一一对应关系.

(1) 覆盖集\(V' = X' \cup Y'\)对应\(N\)中一个简单割\([S, T]\). 更具体来说, 对于\([S, T] = \{ \langle s, u \rangle | u \in X' \} \cup \{ \langle v, t \rangle | v \in Y' \}\)\([S, T]\)\(N\)的简单割.

证明: 由于\(\forall \langle u, v \rangle \in E\)满足\(u \in V'\)\(v \in V'\), 因此\(\forall \langle u, v \rangle \in E\)满足\(\langle s, u \rangle \in [S, T]\)\(\langle v, t \rangle \in [S, T]\), 因此\(\forall p = \langle s, u\rangle \cup \langle u, v \rangle \cup \langle v, t \rangle\)满足\(\langle s, u \rangle \in [S, T]\)\(\langle v, t \rangle \in [S, T]\), 因此\([S, T]\)\(N\)的割且为简单割.

(2) 简单割\([S, T]\)对应覆盖集\(V' = X' \cup Y'\). 具体来说, \(\forall \langle u, v \rangle \in [S, T]\)满足\(u \in V'\)\(v \in V'\).

证明: 将(1)的证明倒过来即可. 不做赘述.

又由于最小割的与最小点权覆盖的优化方向相同, 因此做法可行.

二分图的最大权独立集算法

直接求最小点权覆盖即可(大雾)

例题

有向图破坏

Description:

给定一个有向图\(D = (V, E)\). 对于每个点, 我们给定两个参数a[u]b[u]

  • \(a[u]\): 删掉点\(u\)的所有出边需要花费的代价
  • \(b[u]\): 删掉点\(u\)的所有入边需要花费的代价

问: 将原图中所有边全部删除需要的最小代价是多少?

Solution:

将一个点拆成一个入点, 一个出点, 跑最小点权覆盖即可.

这篇文章到这里可能就弃坑了.

还有最大密度子图没有写.

唉.

posted @ 2017-09-21 11:12  Zeonfai  阅读(533)  评论(0编辑  收藏  举报