本週主題內容較為複雜,時間會帶給各位對圖論演算法的直覺感悟
給圖 ,對邊 有剩餘容量
求從點 到點 的最大流量。
以下圖為例:
邊上面的數字代表容量上限
例如
而 可得流量 或 ,
且當此路徑流量為 時,剩餘容量皆為
流量 則剩餘容量皆
若
則這流量最大只能為 ,是由於邊最多承載容量為
這裡 表示 流量, 容量上限,而剩餘容量為
也就是說:
流量
流量
能得流量
若是
流量
流量
流量
能得流量 ,這就是最大流
在找到最大流量之前,得先討論怎樣的圖,存在著一條可以獲得流量()的路徑
給下圖:
隨便找到一條流 :
找到第二條流 :
這是無向邊,所以它想要往上跑
如果邊容量允許的話這是可行的
中間兩流相遇的部份會相消
中間相遇部份 多少會被減弱一些
所以將顏色改變一下,因為流量不見得與另外兩色相同
給下圖:
幾乎跟上面例子一樣
特別注意, 而
一樣的 :
接著 :
但是 過不去,因為剩餘容量為
若在流 形成時,給予反向邊[1]容量,就能使得 流得過去
也就是:
接下來只需紀錄剩餘容量就足夠知道流量為何了
所以現在邊上數字代表的是剩餘容量
然後給予反向邊容量:
這裡避免圖過於複雜,把 邊去掉
所以現在 能流過去了!
實際上, 到 的流量原本 ,經過 後變為
也就是說,若現在邊上代表的是流量:
所以直覺的,每次找到 augmenting path,讓流送到
不斷重複這個過程,直到找不到 augmenting path,就能求得最大流
這稱作 Ford-Fulkerson method
如果邊是無向的,
則將邊變為兩條剩餘容量相等的有向邊
用 BFS 找出從 到 的 augmenting path
將路徑上各邊的剩餘容量扣除流量,以及將各反向邊[1:1]剩餘容量加上流量。
重複 BFS 直到找不到 augmenting path
感受下圖像化的流程: WilliamFiset/ Edmonds Karp Algorithm
UVa OJ 820 Internet Bandwidth
UVa OJ 10330 Power Transmission
UVa OJ 11987 Almost Union-Find
POJ 2584 T-Shirt Gumbo
POJ 3228 Gold Transportation
Articulation point 中譯 關節點 (簡稱 AP),
當連通圖上此點被拔除,圖會分為多塊連通圖
給定連通圖,找到所有 AP
考慮樹,顯然除葉以外,其餘的節點都為 AP
且若根只有一個子節點,則不為 AP
如何讓 AP 不再是 AP 呢?
例如: 將 變非 AP,可讓 連到 ,及 連到 。
也就是說,若問連通圖中有哪些點是 AP,先遍歷出棵樹 (例如 DFS 樹)
接著直覺的,節點的子孫有邊回到比此節點還高[2] (淺)的節點,則此節點非 AP。
高指的是 level 數字較小,淺指的是 depth 數字較小
而這個連向祖先的邊,稱作 back edge
實作上透過下列兩個函數,以找出所有 AP
Tarjan 用 DFS 遍歷出樹:
UVa OJ 315 Network
ICPC World Finals 2003 Building Bridges
CODEFORCES 194C Cutting Figure
強連通是只屬於有向圖的概念
根據第十一週教材,
雖然有向圖不總有強連通性,但能把圖分成幾塊強連通分塊:
給定圖,求圖至少有幾塊強連通分塊
連通意味著任兩點 之間有路
那麼把 的各邊反過來,對 也反過來,圖理當也連通
表示 到 路徑
因為 及 兩路合併,能得到環,環反過來還是環
也就是說,對於強連通圖:
把邊方向反過來仍具有強連通性:
反邊圖就是把圖上的邊全改為反向
這裡
E
是鄰接矩陣
stack st
紀錄有哪些點是在 forward 走過,但 backward 沒走過
基於 stack 的特性,可將 forward 先一次做完,再一次次做 backward
ICPC Regionals 2008 Taipei Road Networks
UVa OJ 247 Calling Circles
UVa OJ 11838 Come and Go
* ICPC Regionals 2010 Hangzhou Traffic Real Time Query System