最大網絡流
阿新 • • 發佈:2017-07-29
ble tab 起點 body 連通圖 函數 容量 找到 可能
問題定義
流網絡
- 圖G=(V,E):有向圖、連通圖
- 容量:每條邊(u, v)∈G有非負的容量值c(u, v),表示該邊的流量最大值
- 反平行邊:兩條邊的起點和終點相反,(u, v)和(v, u)是反平行
- 圖中不允許有反平行邊,也就是有邊(u, v),則不存在反方向的邊(v, u)
- 圖中不允許自循環
- 圖中有兩個點源結點s和匯點t。源結點是網絡流的起點,匯點是流的終點
G中流
-
一個實值函數f:V x V -> R,兩個點間的流量
-
性質1——容量限制:每條邊上的流不超過容量。對於所有結點u, v∈V,要求0≤f(u, v)≤c(u v)
- 性質2——流量守恒
最大流問題
給定一個流網絡G、一個源結點s、一個匯點t,找到值最大的一個流
定義:出發點為源點,接受流量 的匯聚點為匯點,邊上的權值為可以流過的最大值
幾個關鍵定義
殘存網絡Gf:由仍可以對流量進行增加/減少的邊構成(流過的量不超過容量的邊),包含原圖中的邊,以及可能包含對應的反向邊
殘存容量cf:一條邊還可以增加的最大流量(與容量c不同,c表示的是一開始就確定的流量最大值)
由cf再定義一次Gf:cf>0的邊
為什麽要在Gf中加反向邊?
通過增加反向邊,讓我們可以撤銷原來的流量操作。為什麽要撤銷呢?
來自《數據結構與算法分析》上的一個例子
原圖 | 流圖(原圖上的流) | 殘余網絡 | |
殘余網絡中沒有增加反向邊 s->t沒有新的可達路徑 算法結束,但沒有達到目的 (得到最大流) |
|||
原來的網絡流圖 0/5表示邊的容量為5 |
圖中每條邊上流量的一個狀態 選擇一條可達路徑s-a-d-t 發送流量=3到這條路徑上 |
增加了反向邊, s->t存在新的可達路徑 把原來s-a-d-t的流撤銷一部分 被撤銷的部分可以分流到其它路徑 |
增廣路徑:給定流網絡G=(V, E),增廣路徑是殘存網絡中一條從源結點到匯點的簡單路徑(沒有分支)
流網絡的切割
流網絡G=(V, E)的一個切割就是將結點集合劃分成兩個集合S和T (T=V-S)
- 切割(S, T)的容量:集合S中每個點到集合T中每個點的容量之和
- 最小切割:網絡中容量最小的切割
- 最大流最小切割定理
設f為流網絡G=(V, E)中的一個流,該流網絡的源結點為s,匯點為t,則下面的條件等價:
-
- f是G的一個最大流
- 殘存網絡Gf不包括任何增廣路徑
- |f|=c(S, T) 流網絡中任意流都不能超過任意切割的容量
Ford-Fulkerson方法
基本步驟
- 尋找一條增廣路徑p,用p來對流進行修改(增加)
- 直到沒有任何增廣路徑
整理了一下概念,接下來找找例子再補一下
參考
1. 《算法導論》原書第3版
2. 《數據算法與算法分析——C語言描述》原書第2版
最大網絡流