---
# System prepended metadata

title: 最大流量-最小割定理 Max-flow Min-cut Theorem
tags: [內湖高中程式競賽]

---

# 最大流量-最小割定理 Max-flow Min-cut Theorem
這篇筆記會藉由 Ford-Fulkerson 演算法來聊聊最大流量-最小割定理。記得當初在修演算法課時聽老師說這是一個偉大的發現，我是覺得這定理真的很猛但沒那麼誇張啦。在介紹 Ford-Fulkerson 演算法之前，需要先介紹流量網路 (network flow)，一些性質與引理也順便聊聊

流量網路圖有許多不同的應用，像是現實中可以把水管當作邊，水管交界處用節點，這樣就可以表示成一張流量網路的圖。其他像是公路、電路跟網路傳輸等等都可以用網路流量的圖來建模。如果要說比較抽象的問題，像是二分圖最大匹配問題、二分圖最大點覆蓋問題、最小邊割問題等等都可以用流量網路來轉換

## 流量網路 Network Flow
<!-- West -->

### 網路圖 Network
一張路網圖 $N$ 是一張有向圖，其中 : 
- 存在一個源點 (source vertex) $s$ 
- 存在一個與原點不同的匯點 (sink vertex) $t$
- 每條邊 $e$ 都有非負的容量 (capacity) $cap(e) \geq 0$
- 每條邊 $e$ 都有一個流量 (flow) $f(e)$

註 : 對於每個節點 $v$，可以把流入 $v$ 的流量寫作 $f^+(v)$，流出 $v$ 的流量寫作 $f^-(v)$

### 流量的限制
- 若邊 $e$ 的 flow 符合 $0\leq f(e)\leq cap(e)$，則稱此 flow 是可行的 (feasible)
- 對於每個 $v\notin\{s,t\}$，流量會守恆，$f^+(v)=f^-(v)$，即流入等於流出

### 最大流量 Maximum Network Flow
首先定義 flow $f$ 的值 $val(f)$ (或寫作 $|f|$) 為流入 $t$ 的總流量 $f^+(t)-f^-(t)$。最大流量 (maximum flow) 就是最大的 $val(f)$

註 : 有些書會定義 $val(f)$ 為流出 $s$ 的總流量，但其實種是等價的 (只是數值會為相反數)，以下會證明。我認為用流入 $t$ 的定義會比較直觀

### 流量網路圖的割 Cuts
割的定義與[這篇 Menger 定理](https://hackmd.io/@ShanC/Menger-Theorem)相同，只差多重邊的數量要轉為權重

在流量網路需特別定義割 $[A, B]$ 的容量為 : 
$$
cap(A, B)=\begin{split}\sum_{e~out~of~A}cap(e) \end{split}
$$

## 剩餘網路圖 Residual Graph
<!-- Cormen 交叉比對-->
由於證明會用到剩餘網路圖，所以這裡先來定義一下
### 剩餘邊 Residual Edge
設有向邊 $e=(u, v)$。定義 $e^R=(v, u)$，就是 $N$ 中把方向倒轉過來的邊。每條邊 $e$ 有剩餘容量 (residual capacity) : 

$$
c_f(e)=\begin{cases}
cap(e)-f(e) ~~~\text{if}~ e\in E\\
f(e) ~~~~~~~~~~~~~~~~~~~\text{if}~ e^R\in E
\end{cases}
$$

註 : 這邊說 $e^R$ 倒過來的邊是指，相對於路徑 $s\rightarrow t$ 倒過來的邊

### 剩餘網路圖 Residual Graph
- 邊集合 $E_f=\{e~|~f(e) < cap(e)\} ~\cup~ \{e^R~|~f(e) > 0\}$
- 剩餘圖 $G_f=(V, E_f)$
- 一條增廣路徑 (augmenting path) 是一條 $G_f$ 上的 $s, t$ 路徑，可以寫作 $f$-augmenting path
- 容忍度 (tolerance) 是一條增廣路徑 $P$ 上的最小 $c_f(e)$，即 $min_{e\in E(P)} ~c_f(e)$

註 : West 的書裡只定義了增廣路徑，而 Cormen 的書定義了整張剩餘圖，兩者所使用的剩餘邊定義相同

## 最大流量-最小割定理 Max-flow Min-cut Theorem
以下一連串的引理與證明，都有一些目的
- 引理 1 : 用來處理演算法
- 引理 2 : 把守恆性拓展到割
- 引理 3 : 把割與 flow 兩種觀念結合起來
- 引理 4 : 說明割的 flow 也須遵守的條件

然後增廣路徑定理就很莫名其妙地出現在課本跟講義上，也很奇妙的證明完
最大流量-最小割定理的證明手法也是很玄，到底怎麼想到的啊

### 引理 1
<!-- West -->
若 $P$ 為一條 $f$-augmenting path 且 tolerance 為 $min_{e\in E(P)} ~c_f(e)=z$，則將 $P$ 對應到流量網路圖中順向邊的 flow 加上 $z$，逆向的減去 $z$。如此一來會產生一個全新的 flow $f'$，其值為 $val(f')=val(f)+z$

#### 證明
- feasible : 根據 tolerance 的定義，可以保證每條 $e$ 的 flow $0\leq f'(e)\leq cap(e)$
- 守恆性 : 只需要確認 $P$ 上的 flow 就好，因為其他並沒有被影響到。對於一個 $P$ 上的任意中間節點而言，可以分成四種狀況 (如下圖)。可以發現，每種狀況對於「流入等於流出」這項規定並沒有影響

<center>

<img src="https://hackmd.io/_uploads/ryNFyPc1gx.png" style="margin: 0 auto; display: block; width: 600px">

</center>
    
$~$
綜合上述兩點，從 $P$ 流入 $t$ 的總流量會加上 $z$。得證 
$$
val(f')=val(f)+z
$$

### 引理 2 : 淨流入等於淨流出
若 $U$ 是 $N$ 的節點集合，則流出 $U$ 的淨流量會等於每個點流出的流量加總，即 

$$
\begin{split}f^+(U)-f^-(U)=\sum_{v\in U}\left( f^+(v)-f^-(v)\right)\end{split}
$$

#### 證明
考慮一條邊 $xy$ 的 flow
- 若 $x, y\in U$，則會貢獻在等式右邊，但是都被守恆性抵銷掉了
- 若 $x, y\notin U$，則對於等式沒有貢獻
- 若 $xy\in [U, \bar{U}]$，則對於等式兩邊貢獻皆為正且相同
- 若 $yx\in [U, \bar{U}]$，則對於等式兩邊貢獻皆為負且相同

因此等式成立

### 引理 3 : Flow Value Lemma
<!-- Cormen -->
若 $f$ 是 feasible 且集合 $[S, T]$ 是一個 $s, t$-割 (整張圖切分為 $S, T$，$s\in S, t\in T$)，則 $f^-(S)-f^+(S)=val(f)$

#### 證明
考慮 $f^-(S)=f^+(T)$ 與 $f^+(S)=f^-(T)$，由以下等式可以證明此引理

$$
\begin{split}
f^-(s) - f^+(s)&=\sum_{v\in S}~\left( f^-(v) - f^+(v)\right)
\\&=f^-(S)-f^+(S)
\\&=f^+(T)-f^-(T)
\\&=\sum_{v\in T}~\left( f^+(v) - f^-(v)\right)
\\&=f^+(t)-f^-(t)
\\&=val(f)
\end{split}
$$

這也順便證明了流出源點 $s$ 的淨流量等於流入匯點 $t$ 的淨流量

### 引理 4 : Weak Duality
<!-- Cormen -->
設 flow $f$ 是 feasible 且 $[S, T]$ 是一個 $s, t$-割，則 $val(f)\leq cap(S, T)$

#### 證明
$$
\begin{split}val(f)=f^-(S)-f^+(S)\leq f^-(S)\leq\sum_{e ~out~of~A}cap(e)=cap(S, T)\end{split}
$$

### 增廣路徑定理 Augmenting path Theorem
一個 flow 是最大流量若且唯若不存在任何增廣路徑

#### 證明
下面跟最大流量-最小割定理一起證

### 最大流量-最小割定理 Max-flow Min-cut Theorem
<!-- Cormen -->
一張流量網路圖的最大流量會等於最小割容量

#### 證明
可以把增廣路徑定理跟最大流量-最小割定理拆分成以下三句話，並證明三者彼此等價 : 
(1) 存在一個割 $[A, B]$ 使得 $val(f)=cap(A, B)$
(2) $f$ 是最大流量
(3) 不存在相對於 $f$ 的增廣路徑

- (1)$\Rightarrow$(2) : 根據引理 weak duality 得證
- (2)$\Rightarrow$(3) : 使用反證法，假設 $f$ 是 $N$ 的最大流量且 $G_f$ 中存在一條增廣路徑 $P$。在存在 $P$ 代表可以找到最小 tolerance $z$，使 $val(f')=val(f)+z$ 為新的流量且 $val(f')>val(f)$，這與假設「$f$ 是最大流量」相矛盾。
- (3)$\Rightarrow$(1) : 設 $f$ 為沒有增廣路徑的 flow，$s\in A$ 且 $t\notin A$，可以推出等式如下
$$
\begin{split}
val(f)&=f^-(A)-f^+(A)
\\&=\sum_{~e~out~of~A}f(e)-\sum_{~e~in~to~A}f(e)
\\&=\sum_{e~out~of~A}cap(e)
\\&=cap(A, B)
\end{split}
$$

證畢

## 舉些例子
### 例 1
這個例子中，紅線表示割，可以算出流量 $val(f)=10+3+11=24$，容量 $cap(S, T)=10+5+15=30$

<center>

<img src="https://hackmd.io/_uploads/Bkzh-hikxe.png" style="margin: 0 auto; display: block; width: 600px">

</center>
    
### 例 2
這個例子中，紅線表示割，可以算出流量 $val(f)=6+0+8-1+11=24$，容量 $cap(S, T)=9+15+8+30=62$

<center>

<img src="https://hackmd.io/_uploads/BymAW2jJex.png" style="margin: 0 auto; display: block; width: 600px">

</center>

### 例 3
這個例子中，紅線表示割，可以算出流量 $val(f)=10-4+8-0+10=24$，容量 $cap(S, T)=10+8+10=28$

<center>
    
<img src="https://hackmd.io/_uploads/HyCPMhjkel.png" style="margin: 0 auto; display: block; width:550px">

</center>

### 例 4
這個例子中，與上圖的流量不同，紅線表示割，可以算出流量 $val(f)=10-0+8-0+10=28$，容量 $cap(S, T)=10+8+10=28$。因 $val(f)=cap(S, T)$，所以這就是最大流量與最小割

<center>

<img src="https://hackmd.io/_uploads/Hyl_XX3skeg.png" style="margin: 0 auto; display: block; width:550px">

</center>

## Ford-Fulkerson 演算法
### 演算法
<!-- West 交叉比對-->
- 輸入 : 圖 $N$、源點 $s$、匯點 $t$
- 輸出 : flow $f$
- 想法 : 每次只要能找到一條增廣路徑 $P$，就代表還可以找到更大的 flow，所以就執行引理 1 所描述的方法。如此迭代，直到沒有 $P$ 存在，就回傳 flow $f$。根據最大流-最小割定理，此時的 $f$ 就是最大流量

### Pseudocode
<!-- Cormen -->
```c
FordFulkerson(N, s, t)
    let Gf as the residual graph and cf be the residual capacity
    for each e in N.E
        f(e) = 0
    while there exists a path P from s to t in Gf
        cf(P) = min{cf(e) | e is in P}
        for each e in P
            let eR be the reversed edge
            if e in N.E
                then f(e) = f(e) + cf(P)
            else f(eR) = f(eR) - cf(P)
    return f
```

### 時間複雜度分析
- 初始化 : $O(E)$
- 每找一次擴充路徑，都是花一次遍歷整張圖的時間 : $O(V+E)$
- 若容量介於 $1$ 到 $F$，在最差情況下，所有擴充路徑容量都是 $1$，共找到 $F$ 條，則 $F$ 為最大流量，因此時間為 $O((V+E)\times F)$
- 總時間複雜度簡寫為 $O(EF)$

由於任何數值在電腦的編碼方式中，皆以二進制存取，因此可以將 $F$ 看作是 $2^k$
$\Rightarrow$ **Ford-Fulkerson 演算法實際上的時間複雜度可以看成是指數時間 (exponential running time)**

### 為什麼流量一定要是有理數
Ford 跟 Fulkerson 有在論文中提出一個 $10$ 節點的圖當作例子，但之後也有人提出更簡單的例子來說明為何容量不能是無理數。以下使用 [Zwick 的例子](https://www.sciencedirect.com/science/article/pii/030439759500022O)

此圖的 $r=\cfrac{\sqrt{5}-1}{2}$，其餘沒有標的邊都是 $M\geq 4$

<center>

![](https://hackmd.io/_uploads/HJUr6Wikge.png =300x)

</center>
    
$~$
在這個例子中，永遠找的到一條增廣路徑，所以演算法會陷入無限迴圈

## 整數流 Integral Flows
### Integrality Theorem
若所有容量都是整數，則存在一個最大流量 $f$ 使每條邊的流量 $f(e)$ 都是整數

### 證明
整數在加法與減法會閉合，因此當所有容量都是整數，不會形成非整數的流量

## ShanC 的讀書心得與後記

本篇參考的書籍有三本，關於最大流量-最小割定理的證明方法也各有千秋。其中證明最詳細且難懂的是 Cormen 最經典的演算法那本 "Introduction to Algorithms" 第 24 章，D.B.West 的圖論第 4 章比較像是 Cormen 那本寫的簡略版，而 Diestel 的圖論第 6 章是用完全不同的方法證明。但有一點我覺得很讚的是 West 有說為什麼流量一定要是有理數而不是連無理數都可以

在應用方面，Cormen 本沒有多加著墨，只舉了一個二分圖匹配問題轉成網路最大流量的例子，感覺他那本單純只是把演算法的部分講清楚而已。而 West 本把相關定理講的非常完備，他那本的重點就是要把圖論中的 dual problems 都講完並且可以互相轉換，有點討厭的是他把一些重要的知識 left as exercises......。Diestel 重點在將網路流量圖當成是一種圖的結構，把一些相關的知識點都講一講，而最大流問題只是其中一個。~~整章甚至連 plannar graph, abelian group 都出現了~~ 🤮，重點不與上述兩本完全不同，我也還沒讀完，沒很清楚他想做什麼

總之，這篇筆記整理了書上、網路上與我的修課筆記，簡單來說就是一篇縫合怪，但作為競程的重要知識點已經很足夠了 (~~甚至是太多了~~)。希望大家看完這篇後可以多想想看 flow 可以做啥，在[下一篇](https://hackmd.io/@ShanC/bipartite-and-flow)會講要怎麼轉化最大流和最小割變成其他問題或是定理，然後[下下一篇](https://hackmd.io/@ShanC/Edmonds-Karp-and-Dinic)會講講更快的演算法

----

## 參考資料

- D.B.West - Introduction to Graph Theory 2/e
- Introduction to Algorithms, Fourth Edition
- Reinhard Diestel - Graph Theory
- [The smallest networks on which the Ford-Fulkerson maximum flow procedure may fail to terminate](https://www.sciencedirect.com/science/article/pii/030439759500022O)
- [台師大演算法筆記 - flow](https://web.ntnu.edu.tw/~algo/Flow.html)
- [Howard Wang - 圖形理論](https://hackmd.io/@HowWang/rkts6dUMo#Ch4-Connectivity-and-Paths)

----

> [ShanC 程式競賽筆記](https://hackmd.io/@ShanC/B1ouGxqcC)
> 作者: ShanC
> 更新: 2025/4/29