网络流简介

本页面主要介绍网络流相关的基本知识.

概述

网络(network)是指一个特殊的有向图 G=(V,E)G=(V,E),其与一般有向图的不同之处在于有容量和源汇点.

  • EE 中的每条边 (u,v)(u, v) 都有一个被称为容量(capacity)的权值,记作 c(u,v)c(u, v).当 (u,v)∉E(u,v)\notin E 时,可以假定 c(u,v)=0c(u,v)=0.

  • VV 中有两个特殊的点:源点(source)ss 和汇点(sink)tt(s≠ts \neq t).

对于网络 G=(V,E)G=(V, E),流(flow)是一个从边集 EE 到整数集或实数集的函数,其满足以下性质.

  1. 容量限制:对于每条边,流经该边的流量不得超过该边的容量,即 0≤f(u,v)≤c(u,v)0 \leq f(u,v) \leq c(u,v);
  2. 流守恒性:除源汇点外,任意结点 uu 的净流量为 00.其中,我们定义 uu 的净流量为 f(u)=∑x∈Vf(u,x)−∑x∈Vf(x,u)f(u) = \sum_{x \in V} f(u, x) - \sum_{x \in V} f(x, u).

对于网络 G=(V,E)G = (V, E) 和其上的流 ff,我们定义 ff 的流量 ∣f∣|f| 为 ss 的净流量 f(s)f(s).作为流守恒性的推论,这也等于 tt 的净流量的相反数 −f(t)-f(t).

对于网络 G=(V,E)G = (V, E),如果 {S,T}\{S, T\} 是 VV 的划分(即 S∪T=VS \cup T = V 且 S∩T=∅S \cap T = \varnothing),且满足 s∈S,t∈Ts \in S, t \in T,则我们称 {S,T}\{S, T\} 是 GG 的一个 ss-tt 割(cut).我们定义 ss-tt 割 {S,T}\{S, T\} 的容量为 ∣∣S,T∣∣=∑u∈S∑v∈Tc(u,v)||S, T|| = \sum_{u \in S} \sum_{v \in T} c(u, v).

常见问题

常见的网络流问题包括但不限于以下类型问题.

  • 最大流问题:对于网络 G=(V,E)G = (V, E),给每条边指定流量,得到合适的流 ff,使得 ff 的流量尽可能大.此时我们称 ff 是 GG 的最大流.
  • 最小割问题:对于网络 G=(V,E)G = (V, E),找到合适的 ss-tt 割 {S,T}\{S, T\},使得 {S,T}\{S, T\} 的总容量尽可能小.此时我们称 {S,T}\{S, T\} 的总容量是 GG 的最小割.
  • 最小费用最大流问题:在网络 G=(V,E)G = (V, E) 上,对每条边给定一个权值 w(u,v)w(u, v),称为费用(cost),含义是单位流量通过 (u,v)(u, v) 所花费的代价.对于 GG 所有可能的最大流,我们称其中总费用最小的一者为最小费用最大流.

我们将在稍后的章节中对它们进行详细介绍.

例题:网络流 24 题

网络流 24 题是中文互联网上广泛流传的一个题单(LibreOJ/洛谷),至少在 2010 年前后就已经存在.该题单引入了一些经典的将其他问题建模为网络流问题的技巧.由于时代的局限性,这些问题未必是最具代表性的网络流问题,但仍值得有志于算法竞赛的读者一阅.

本文内容来自 OI Wiki《网络流简介》;作者与修订历史见原文。AIOJ 对排版、站内链接和资源路径做了格式适配。

内容依 CC BY-SA 4.0 与 SATA 许可共享;附加条款以原文声明为准。感谢 OI Wiki 作者与贡献者;请按 SATA 约定前往 OI Wiki 仓库 Star 支持。