「网络流浅谈」网络流的概念

· 浏览次数 : 0

小编点评

**1. 流网络概念** * 流网络是一个二维图 \\(G=(V,E)\\),其中 \\(V\\) 是点集,\\(E\\) 是边集。 * 每个边 \\(u,v\\) 拥有容量 \\(c(u,v)\)。 * 存在源点 \\(s\\) 和汇点 \\(t\\),源点连接到所有点,汇点连接到所有点。 **2. 可行流** * 可行流对于每个流网络满足以下条件: * 容量限制: \\(0\le f(u,v) \le c(u,v)\\) * 流量守恒: \\(\\sum_{(v,x)\\in E}f(v,x)=\\sum_{(x,v)\\in E}f(x,v)\\) **3. 残留网络** * 残留网络是一个图 \\(G_f=(V,E+!E)\\),其中 \\(V,E\\) 是源网络的边集和点集,\\(!E\\) 表示 \\(E\\) 中的所有反向边。 * 容量: \\(c'(u,v)=c(u,v)-f(u,v)\\) **4. 增广路径** * 增广路径在残留网络沿着容量大于 \\(0\\) 的边如果能够走到终点,这条路径称为增广路径。 **5. 割** * 割是指将点集 \\(V\\) 分成不重叠 \\(S\\) 和 \\(T\\),使源点在 \\(S\\),汇点在 \\(T\\)。 * 割的容量: \\(c(S,T)=\\sum_{u\\in S}\\sum_{v\\in T} c(u,v)\\) **6. 最大流最小割定理** * 最大流最小割定理:最大流 \\(\\le\\) 最小割。 * 最大流最小割定理的三个条件: * 仅需知道 \\(1\\) 个条件就能够推出另外 \\(2\\) 个。 * 最大流是残留网络中不存在增广路径。 * 最大流等于源点集和汇点集之间的最大流值。

正文

通常做题思路:问题转化为流网络,再通过最大流 / 最小割 / 费用流与问题之间的数量关系,求解出原问题。

网络流于其他算法不同,概念定理需要熟记于心,否则后面做题会有很大的障碍。

1. 流网络

一个流网络记作 \(G=(V,E)\),其中 \(V\) 表示点集,\(E\) 表示边集。对于 \(\forall (u,v)\in E\),都有一个容量记作 \(c(u,v)\)。由于是一张流网络,那肯定还应该有汇点与源点,通常记作 \(s,t\)

如图,这就是一张流网络。

2. 可行流

对于每一个流网络,满足以下 \(2\) 个条件为可行流:

  1. 容量限制

    ​ 记作:\(0\le f(u,v) \le c(u,v)\),即流经每条边的流量不能超过他的限制。

  2. 流量守恒

    ​ 记作:\(\sum_{(v,x)\in E}f(v,x)=\sum_{(x,v)\in E}f(x,v)\),即除了源点与汇点之外,流入点 \(i\) 的总流量 \(=\) 流出点 \(i\) 的总流量。

可行流的流量 \(|f|\),是指从源点流出的总流量。

即:\(|f|=\sum_{(s,v)\in E}f(s,v)-\sum_{(v,s)\in E}f(v,s)\)

3. 残留网络

一般来说,残留网络记作 \(G_f=(V,E+!E)\),其中 \(V,E\) 是源网络的边集和点集,\(!E\) 表示 \(E\) 中的所有反向边。

容量:

\[c'(u,v)=\begin{cases} & c(u,v)-f(u,v) & (u,v)\in E \\ & f(u,v) & (u,v) \in !E \end{cases} \]

定理

\(f\) 为原网络的可行流\(f'\) 为残留网络的可行流

则有:\(f+f'\) 也是 \(G\) 的一个可行流且 \(|f+f'|=|f|+|f'|\)

证明:定义 \(f_{n}=f+f'\),则 \(f_n(u,v)=f(u,v)+f'(u,v)\)(注意这里只考虑正向边),为了证明也是一个可行流,无非从 \(2\) 方面:容量限制和流量守恒。

容量限制:\(f'(u,v)\le c'(u,v)=c(u,v)-f(u,v)\),所以 \(f(u,v)+f'(u,v)\le c(u,v)\)

流量守恒:因为 \(f(u,v)\) 满足流量守恒,\(f'(u,v)\) 也满足流量守恒,所以 \(f(u,v)+f'(u,v)\) 也满足流量守恒(这里只是略证,更多细节大家可以展开观察)。

4. 增广路径

在残留网络沿着容量大于 \(0\) 的边如果能够走到终点,这条路径称为增广路径。(注意:增广路径只是一条路径,而非一个网络)

5. 割

5.1 定义:

将点集 \(V\) 分成不重叠 \(S\)\(T\), 使得源点在\(S\),汇点在 \(T\)

5.2 割的容量

\(c(S,T)=\sum_{u\in S}\sum_{v\in T} c(u,v)\)

最小割: 最小的割的容量

5.3 割的流量

\(f(S,T)=\sum_{u\in S}\sum_{v\in T} f(u,v)-\sum_{v\in S}\sum_{u\in T} f(u,v)\)

性质1: \(\forall [S,T], f(S,T)\le c(S,T)\)

证明: 由于 \(f(u,v)\) 是大于等于 \(0\) 的,所以 \(f(S,T)\le \sum_{u\in S}\sum_{v\in T} f(u,v)\),又因为有容量,所以一定 \(\le \sum_{u\in S}\sum_{v\in T} c(u,v)\) ,故 \(\forall [S,T], f(S,T)\le c(S,T)\)


性质2: \(\forall [S,T], f(S,T)= |f|\)

证明2:

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

则:\(f(X,Y)=-f(Y,X)\)\(f(X,X)=0\)\(f(Z,X\cup Y)=f(Z,X)+f(Z,Y), X\cap Y= \varnothing\)

那么有:

\[\begin{aligned} &\because S\cup T=V,S\cap T=\varnothing,\\ &\therefore f(S,V)=f(S,S)+f(S,T)\\ &\therefore f(S,T)=f(S,V)-f(S,S)=f(S,V)=f(\{s\},V)+f(S-\{s\},V)=f(\{s\},V)=|f|\\ \end{aligned} \]


那么 \(|f|=f(S,T)\le c(S,T)\)

即,\(|f|\le c(S,T)\);故,最大流 \(\le\) 最小割

7. 最大流最小割定理

(1)可行流 \(f\) 是最大流

(2)\(G_f\) 中不存在增广路

(3)\(|f|=c(S,T)\)

在三个条件中,仅需知道 \(1\) 个,就能够推出另外 \(2\) 个,证明略。

与「网络流浅谈」网络流的概念相似的内容:

「网络流浅谈」网络流的概念

通常做题思路:问题转化为流网络,再通过最大流 / 最小割 / 费用流与问题之间的数量关系,求解出原问题。 网络流于其他算法不同,概念定理需要熟记于心,否则后面做题会有很大的障碍。 1. 流网络 一个流网络记作 \(G=(V,E)\),其中 \(V\) 表示点集,\(E\) 表示边集。对于 \(\fo

[转帖]【网络小知识】之TCP IP 五元组(five-tuple/5-tuple)

为什么要分享TCP IP 5元组(five-tuple/5-tuple的知识? 最近在进行深度分析过程中,听到某些资深人士提到了5元组这个概念,觉得很高大尚,去搜索了一圈,发现都是些非常浅显的知识,对于tcp ip 5元组,7元组有什么用没有提及,也没有五元组的英文,导致英文资料检索过程中饶了一圈。

「网络流浅谈」最大流的应用

二分图匹配 考虑如何将二分图匹配问题,转化为流网络。设置 \(1\) 个汇点和源点,从源点向二分图一侧的每一个点连边,从另一侧向汇点连边,边权均为 \(1\),二分图中的边也全部加入,权值设为 \(1\)。这样,二分图的最大匹配等于流网络的最大流。 P2756 飞行员配对方案问题 题意:给定 \(1

「网络流浅谈」最小割的模型

总结了最小割的四个模型——最大权闭合图,最大密度子图,最小点覆盖集,最大权独立集。带你走进最小割的神秘!

「网络流浅谈」最小割的模型 1

最大权闭合子图 引入 闭合子图指对于子图 \(G=(V,E)\),\(\forall u \in V, (u,v)\in E\),都有 \(v\in V\)。 最大权闭合子图无非就是对于所有的闭合子图 \(G\) 中 \(\sum_{u\in V} w_u\) 最大的闭合子图。 对于这个图中,闭合子

[转帖]张磊:浅谈容器网络

https://zhuanlan.zhihu.com/p/595014129 你好,我是张磊。今天我和你分享的主题是:浅谈容器网络。 在前面讲解容器基础时,我曾经提到过一个Linux容器能看见的“网络栈”,实际上是被隔离在它自己的Network Namespace当中的。 而所谓“网络栈”,就包括了

浅谈k8s中cni0和docker0的关系和区别

最近在复习k8s网络方面的知识,查看之前学习时整理的笔记和文档还有过往自己总结的博客之后发现一个问题,就是在有关flannel和calico这两个k8s网络插件的文章和博客中,会涉及到cni0和docker0这两个网桥设备,但是都没有明确说明他们俩之间的关系,有的甚至将两者混为一谈,这也是我之前的学

500代码行代码手写docker-设置网络命名空间

# (4)500代码行代码手写docker-设置网络命名空间 > 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。 本章的源码已经上传到github,地址

算法学习笔记(8): 网络流

# 网络流 > 网络流是一个博大精深的一个话题…… ## 箕(基)畚(本)知识 文章链接:[基本知识](https://www.cnblogs.com/jeefy/p/17050220.html) ## 网络最大流 文章链接:[网络最大流](https://www.cnblogs.com/jeefy

算法学习笔记(8.0): 网络流前置知识

网络流基础 网络流合集链接:网络流 网络 $G = (V, E)$ 实际上是一张有向图 对于图中每一条有向边 $(x, y) \in E$ 都有一个给定的容量 $c(x, y)$ 特别的,若 $(x,y) \notin E$ , 则 $c(x, y) = 0$ 图中还有两个指定的特殊结点,$S, T