本主題會用到第五週教材的內容
Articulation point 中譯 關節點
當連通圖上此關節點被拔除,圖會分為多塊連通圖
通常只要求此連通圖為弱連通的
給定連通圖,找到所有 AP
考慮樹,顯然:
如何讓 AP 不再是 AP 呢?
例如: 將 變非 AP,可讓 連到 ,及 連到 。
也就是說,若問連通圖中有哪些點是 AP,先遍歷出棵樹 (例如 DFS 樹)
接著直覺的,節點的子孫有邊回到比此節點還高[1] (淺)的節點,則此節點非 AP。
高指的是圖像的相對位置,淺指的是 depth 數字較小
而這個連向祖先的邊,稱作 back edge
過程中透過下列兩個函數,以找出所有 AP
low 這個詞應該是指深度較小的意思
Tarjan 用 DFS 遍歷出樹,所以從樹來看,當節點 的的子節點 有 就表示拔除 會使 走不到更高的節點,所以 就是此圖的 AP
實作上:
cnt
判斷該點是否為葉節點或不為 AP 的根節點根節點深度為 0
UVa OJ 315 Network
ICPC World Finals 2003 Building Bridges
CODEFORCES 194C Cutting Figure
強連通是只屬於有向圖的概念
根據第十一週教材,
雖然有向圖不總有強連通性,但能把圖分成幾塊強連通子圖
而 SCC 要求的是分出盡量大的強連通子圖:
換句話說,就是子圖的點要盡量多
如果不這麼找,會有很多種分法,至少單獨一點也算強連通子圖
給定圖,求圖有幾塊極大強連通子圖
連通意味著任兩點 之間有路
那麼把 的各邊反過來,對 也反過來,圖理當也連通
表示 到 路徑
因為 及 兩路合併,能得到環,環反過來還是環
也就是說,對於強連通圖:
把邊方向反過來仍具有強連通性:
反邊圖就是把圖上的邊全改為反向
這裡
E
是鄰接矩陣,E[a][b]
表示有a
到b
的邊
stack st
紀錄有哪些點是在 forward 走過,但 backward 沒走過
基於 stack 的特性,可將 forward 先一次做完,再一次次做 backward
ICPC Regionals 2008 Taipei Road Networks
UVa OJ 247 Calling Circles
與找圖中 articulation point 時類似,要利用到 DFS 樹的觀念
但不能使用 函數,必須換成 ,定義為
最高指的是 dfn 數字最小
連通圖是由環所構成的,且要找的是極大的連通子圖,所以當:
在實作上,會使用 stack st
記錄[5]目前搜索中的節點,
對於連通兩點 ,從高處往低處搜索有 ,則透過 back edge 才會有 ;
故搜索時欲建立 back edge 時,並不會考慮 st
中以外的節點
提醒,建立 back edge 就是在更新 low 值
表示 還未搜索過,所以對於該 都要去做 DFS:
證明 Tarjan's algorithm for SCCs 不能用 取代
證明 Tarjan's algorithm for APs 可以用 取代
給定一棵樹,
若節點 滿足其孫子節點有 或是 或 ,則稱 為 的共同祖先
而共同祖先中離根節點最遠或說深度最深的節點稱作 的最近共同祖先
如上圖 的共同祖先有 ,最近共同祖先為 ;而 的共同祖先為
求某節點對的最近共同祖先 (LCA)
又是你啊!Tarjan?
以 DFS 這棵樹,走到某節點 時,會將一些子樹走訪完,接著再往下個子樹走訪
明顯的,走訪完的子樹上的節點與下個子樹上的節點的 LCA 就是
如圖,黃色部分是走訪完的子樹,接著要往 走訪,那麼 與黃色節點的 LCA 就為
實作上:
這裡
E
是鄰接矩陣,E[a][b]
表示有a
到b
的邊
這樣就將所有節點對的 LCA 都找完了
上圖 的共同祖先有 ,其中 是 LCA
可觀察到任意兩節點 的 LCA 的祖先們一定是 的共同祖先
於是若 的深度相同時,讓兩者同時往上走,第一次遇到的共同祖先就是 LCA
而不失一般性若 深度大於 ,只要先讓 往上走到跟 相同的深度就行了
如上圖欲找 的 LCA,先讓 走到與 深度相同的 ,接著兩者走到 ,再走到
又是你啊!?二進制??
LCA 與兩節點的距離一定是整數,整數可由 的幂 獨立[6]和成
所以只需將每節點 的幂距離的祖先節點記錄起來,再透過這些距離跳到 LCA 就行了
如上圖找 的 LCA,
看出距離為 ,先以距離 跳到 ,再以距離 跳到
實作上用陣列值 an[u][i]
表示與 距離為 的祖先節點
將每個節點的深度以及距離 的祖先節點都記錄起來
an[v][i] = an[an[v][i-1]][i-1]
就相當於v
距離 的祖先
前項 為w = an[v][i-1]
,後項 則為an[w][i-1]
接著就能算某節點對 的 LCA 為何:
POJ 1330 Nearest Common Ancestors
ICPC Regionals 2010 Hangzhou Traffic Real Time Query System
TIOJ 1163 6.施工中的道路
所謂的比較高,意思是距離根比較近 ↩︎
Wikipedia/ A demo of Tarjan's algorithm to find cut vertices. ↩︎
Wikipedia/ Graph with strongly connected components marked ↩︎
也可以嘗試將搜索到的節點留給 DFS 函數 ↩︎
每個幂最多取一次 ↩︎