圖的搜尋與分解

圖中的橋(bridges in a graph)

網路中有些連結是把兩塊區域維繫在一起的唯一憑藉——剪斷那一條連結,兩塊區域就分開。無向圖的一條橋(或割邊)正是這樣的邊:移除它會增加連通分量的數目,把一塊連通部分一分為二。就像城市兩半之間唯一的一座實體橋,它是跨越鴻溝的唯一連接,失去它就切斷一切倚賴在那裡跨越的往來。

界定性質很乾淨:一條邊是橋,當且僅當它不在任何環上。直覺是:若邊 (u, v) 屬於某個環,便存在第二條與它不共邊、繞環另一邊走的 u 到 v 路線,所以刪掉 (u, v) 不會切斷任何東西——替代路線還在。若沒有這樣的環,這條邊就是唯一的路徑,失去它便造成不連通。這直接轉化為一趟用 low-link 值的 DFS 測試。照常計算 disc(u)(發現時間)與 low(u)(從 u 子樹出發、沿樹邊加上至多一條回邊所能抵達的最早發現時間)。一條樹邊 (u, v)(v 為子節點)是橋,恰當 low(v) > disc(u):這表示 v 子樹中沒有任何東西能透過回邊回到 u 或任何更早的頂點,所以通往 v 的樹邊是唯一的連接——沒有環包含它。(嚴格大於 disc(u),不同於關節點所用的 >=;這一個差別就是整個區別所在。)

找出橋跑在 O(n + m),一趟走訪,它辨識出失效便會分割網路的關鍵連結——在道路、纜線與管線的可靠度分析,以及把圖分解成 2-邊連通分量時不可或缺。兩個誠實的要點。第一,當心平行邊(同一對頂點之間有兩條邊):若有兩條,兩條都不是橋,因為彼此互為備援——忽略重數的天真 low-link 程式碼會弄錯這點,所以你必須避免把當下的父邊當成回邊,同時仍尊重真正的第二條平行邊。第二,橋(移除一條邊)與關節點(移除一個頂點)不同;它們常一致卻非總是如此,而測試中嚴格與非嚴格不等號之別,正是分隔它們的關鍵。

兩個三角形 {a,b,c} 與 {d,e,f},由單一條邊 c-d 相連。每個三角形內每條邊都在一個環上,所以都不是橋。但 c-d 不在任何環上:移除它,圖就裂成 {a,b,c} 與 {d,e,f}。所以 c-d 是唯一的橋,滿足 low(d) > disc(c)。

不在任何環上的邊就是橋;在 DFS 測試中那恰是 low(子節點) 嚴格大於 disc(父節點)。

橋的測試用嚴格的 low(v) > disc(u);關節點的測試用 low(v) >= disc(u)。而平行邊會擊垮天真的程式碼:同一對頂點之間的兩條邊絕非橋,所以要處理重數,而不只是「那條父邊」。

又称
cut edges割邊