zoukankan      html  css  js  c++  java
  • 网络流相关学习笔记

    一些概念

    网络与流

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

    网络(G)是一个实质函数(f : V imes V o 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 angle 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 imes 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 angle in p } ]

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

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

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

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

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

    • (ecause c_f(p) = min{ c_f(u, v) | langle u, v angle in p } herefore f_p(u, v) = c_f(p) le c_f(u, v)). 因而满足流量限制.
    • (ecause langle u, v angle in P herefore 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 angle | langle u, v angle 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|).

    证明:

    [egin{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 otin 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 angle | v in V, w_v > 0 } cup { langle v, t angle | v in V, w_v < 0 } \ egin{cases}{} c(u, v) = infty & langle u, v angle 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 angle 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 angle in E), 由于简单割不含(E)中任何边, 因而(v otin 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 angle otin E).

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

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

    二分图的最小点权覆盖

    给定一个二分图(G = (V = X cup Y, E)), 每个点有点权(w_u), 要你找到一个点集(V' = X' cup Y'), 使得(forall langle u, v angle 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 angle | u in X } cup { langle v, t angle | v in Y } \ egin{cases}{} c(u, v) = infty & langle u, v angle 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 angle | u in X' } cup { langle v, t angle | v in Y' })([S, T])(N)的简单割.

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

    (2) 简单割([S, T])对应覆盖集(V' = X' cup Y'). 具体来说, (forall langle u, v angle 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:

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

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

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

    唉.

  • 相关阅读:
    怎么将ETL技术落地
    vue.js解决刷新404找不到页面问题
    Python 图像识别入门篇
    快速实现CentOS7安装python-pip
    ffmpeg+HLS实现直播与回放
    HBase 二级索引与Coprocessor协处理器
    你做电商死法TOP10:你中了几枪?
    讲讲跳跃表(Skip Lists)
    说框架设计思路
    《Effective Java 第三版》目录汇总
  • 原文地址:https://www.cnblogs.com/ZeonfaiHo/p/7567589.html
Copyright © 2011-2022 走看看