算法(H)笔记——最大流

本文最后更新于 2026年7月8日 20:26:29

最大流

流的定义

\(G=(V,E)\) 为一个流网络,其容量函数为 \(c\)。设 \(s\) 为网络源点,\(t\) 为汇点。

\(G\) 中的流是一个实值函数:

\[ f: V \times V \to \mathbb{R} \]

它满足下面两个性质。

容量限制

对于所有结点 \(u,v \in V\),要求:

\[ 0 \le f(u,v) \le c(u,v) \]

也就是说,一条边上的流量不能为负,也不能超过这条边的容量。

流量守恒

对于所有结点 \(u \in V-\{s,t\}\),要求:

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

也就是说,对于非源点、非汇点的中间结点,流入量等于流出量。

无边时的流量

\((u,v) \notin E\) 时,从结点 \(u\) 到结点 \(v\) 的流量为:

\[ f(u,v)=0 \]

流的值

\(f\) 的值 \(|f|\) 定义为从源点 \(s\) 流出的总流量减去流入源点 \(s\) 的总流量:

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

直观理解:最大流问题就是希望让从源点 \(s\) 到汇点 \(t\) 的总流量尽可能大。

残存网络

设有一个流网络 \(G=(V,E)\),其源点为 \(s\),汇点为 \(t\)。设 \(f\) 为图 \(G\) 中的一个流。

对于结点对 \(u,v \in V\),定义残存容量 \(c_f(u,v)\) 为:

\[ c_f(u,v)= \begin{cases} c(u,v)-f(u,v), & \text{若 } (u,v) \in E \\ f(v,u), & \text{若 } (v,u) \in E \\ 0, & \text{其他} \end{cases} \]

含义:

  • 若原图中存在边 \((u,v)\),则这条边还能继续增加的流量是 \(c(u,v)-f(u,v)\)
  • 若原图中存在反向边 \((v,u)\),则可以沿反方向撤回的流量是 \(f(v,u)\)
  • 若两者都不存在,则残存容量为 \(0\)

残存网络用于描述:在当前流 \(f\) 的基础上,哪些方向还可以继续调整流量。

切割与最小切割

网络 \(G=(V,E)\) 中的一个切割 \((S,T)\),是将结点集合 \(V\) 划分为两个集合 \(S\)\(T=V-S\),并满足:

\[ s \in S, \quad t \in T \]

也就是说,切割必须把源点和汇点分到两边。

横跨切割的净流量

\(f\) 是一个流,则定义横跨切割 \((S,T)\) 的净流量为:

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

含义:从 \(S\) 流向 \(T\) 的总流量,减去从 \(T\) 流回 \(S\) 的总流量。

切割的容量

切割 \((S,T)\) 的容量定义为:

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

即所有从 \(S\) 指向 \(T\) 的边的容量之和。

一个网络的最小切割,就是整个网络中容量最小的切割。

关键性质

引理 26.4

\(f\) 为流网络 \(G\) 的一个流,该流网络的源点为 \(s\),汇点为 \(t\)

\((S,T)\) 是流网络 \(G\) 的任意切割,则横跨切割 \((S,T)\) 的净流量等于流的值:

\[ f(S,T)=|f| \]

推论 26.5

流网络 \(G\) 中任意流 \(f\) 的值不能超过 \(G\) 的任意切割的容量:

\[ |f| \le c(S,T) \]

含义:任何一个切割都给出了最大流的一个上界。

定理 26.6:最大流最小切割定理

\(f\) 为流网络 \(G=(V,E)\) 中的一个流,该流网络的源点为 \(s\),汇点为 \(t\)。下面三个条件是等价的:

  1. \(f\)\(G\) 的一个最大流。
  2. 残存网络 \(G_f\) 不包含任何增广路径。
  3. \(|f|=c(S,T)\),其中 \((S,T)\) 是流网络 \(G\) 的某个切割。

直观理解:

  • 如果残存网络中还有增广路径,就还能继续增加流量,所以当前流不是最大流。
  • 如果已经没有增广路径,则当前流已经达到最大。
  • 最大流的值等于某个最小切割的容量。

课堂备注

板书上的方法比教材上的写法更简化,主要过程可以理解为:

  1. 从当前流出发,构造残存网络。
  2. 在残存网络中寻找从 \(s\)\(t\) 的增广路径。
  3. 沿增广路径增加流量。
  4. 若找不到增广路径,则当前流就是最大流。
  5. 此时可以由残存网络得到对应的最小切割。

二分图最大匹配

  • 增加s和t

额外内容

淘汰赛

flowchart LR
    s((s))

    AB[比赛 AB<br/>容量 2]
    AC[比赛 AC<br/>容量 3]
    BC[比赛 BC<br/>容量 4]

    A[队伍 A<br/>最多再赢 1]
    B[队伍 B<br/>最多再赢 4]
    C[队伍 C<br/>最多再赢 6]

    t((t))

    s -->|2| AB
    s -->|3| AC
    s -->|4| BC

    AB -->|∞| A
    AB -->|∞| B

    AC -->|∞| A
    AC -->|∞| C

    BC -->|∞| B
    BC -->|∞| C

    A -->|1| t
    B -->|4| t
    C -->|6| t

10:30的板书?0612

左边是将最短路转换成线性规划,右边是将最大流转换成线性规划

  • 最短路:最大化每个点的d;约束:I 源点d=0 II 其他用线段长度+三角不等式限制
    • 从下往上顶,去找到最短路

两个算法的证明与分析

image-20260627181200598

47一定不行,因为NY和BALL之间有五场比赛要打,一个75一个71,打完至少一个为76>47+28=75

不能只看总和


算法(H)笔记——最大流
https://travellingsheep.github.io/2026/07/05/笔记/算法(H)笔记——最大流/
作者
trs62
发布于
2026年7月5日
许可协议