標籤:方法 之間 解釋 因此 方案 改版 log box 公用祖先
有一個問題:給出一張連通的無向圖,加上最少的邊使得它成為邊雙連通圖
網上有一個結論,就是只要求出邊雙的縮點樹,然後找出其中只與一條邊相連的點個數k,答案就是(k/2)(上取整)
網上有一些解釋
摘自https://www.byvoid.com/zhs/blog/biconnect
統計出樹中度為1的節點的個數,即為分葉節點的個數,記為leaf。則至少在樹上添加(leaf+1)/2條邊,就能使樹達到邊二連通,所以至少添加的邊數就是(leaf+1)/2。具體方法為,首先把兩個最近公用祖先最遠的兩個分葉節點之間串連一條邊,這樣可以把這兩個點到祖先的路徑上所有點收縮到一起,因為一個形成的環一定是雙連通的。然後再找兩個最近公用祖先最遠的兩個分葉節點,這樣一對一對找完,恰好是(leaf+1)/2次,把所有點收縮到了一起。
摘自評論
想請問對於樹1--2; 1--3; 1--4; 2--5; 2--6; 3--7; 3--8; 4--9; 4--10. 來說, 依照上述構造雙連通圖的方法, 第一步可以選擇把葉子(5,10) 連起來, 而LCA(5,10) 是1 (Root), 為最遠的. 接著同理, 串連葉子(6,9). 則最後只剩下葉子(7,8) 可選, 此時便出現無解的情況了, 若遇到這種情況是不是會發生問題呢? 似乎採用編號法可以解決這個問題.
好像有一點小問題?怎麼證明/構造?
試著再給一個證明(有錯的,只是先記一下)
首先,k個點中每一個點都必須加一條邊,否則不可能使得圖邊雙連通,因此答案的一個下界為將它們兩兩串連的代價:(k/2)(上取整)
然後給一種構造方法,是以上方法的改版:
每一次找到樹中某兩個點,然後在這兩個點之間連一條邊,那麼這兩個點路徑上所有點都可以被縮成一個點
將這些點縮起來,之後仍然為一棵樹,且其餘只與一條邊相連的點不受影響(畢竟絕對不可能被縮排去的),也不會產生新的只與一條邊相連的點(除了最後的幾次縮點操作之外)(這個真的能夠保證嗎?給出一種嘗試:產生新的只與一條邊相連的點,若且唯若兩點間的路徑上(除兩點外)只有最多一個點與路徑外的點有最多一條邊相連;設法證明每一次都可以避開這樣的選擇方案(怎麼證?))
顯然任意一次操作中都能找到這樣的兩個點,直到只剩1或0個只與一條邊的點;只剩1個點時隨便找一個點連起來即可
這樣每次一定能少掉2個(最後一次可能為1個)只與一條邊相連的節點,總代價為(k/2)(上取整)
邊雙?