1. 程式人生 > 其它 >無向圖的雙連通分量

無向圖的雙連通分量

總結無向圖雙連通分量相關概念以及應用

概念解釋

  • 連通分量:無向圖的極大連通子圖。連通圖的連通分量是其自身,非連通圖有多個連通分量
  • 割邊(橋):一無向圖中,一條邊稱為橋應當滿足當刪除這條邊後,圖的連通分量增多
  • 割點:一無向圖中,一個點稱為割點應當滿足當刪除這個頂點和與其相關聯的邊後,圖的連通分量增多

分類

  • 邊雙連通分量:一連通分量稱之為邊連通分量,應當滿足去掉任意一條邊,都不會改變此圖的連通性,即不存在橋
  • 點雙連通分量:一連通分量稱之為點連通分量,應當滿足去掉任意一個點後,都不會改變此圖的連通性,即不存在割點

橋和割點的判定思路


有向圖求scc類似,同樣引入\(dfn\)\(low\)兩個標記。對於(x, y),如果x->y是橋,應當滿足\(low[y] > dfn[x]\)



注:

  1. 此時為無向圖,同時存在父->子,子->父兩條路徑,在Tarjan過程中,必須保證一條邊不能重複走,因為橋的判定條件為\(low[y] > dfn[x]\),如果可以重複走,則至少可以滿足\(low[y] >= dfn[x]\),無法再判定出橋的存在了

在有向圖中,存在一種情況是,“一個點a處在某個scc中,另一個點b搜尋到a點時a已經彈棧”,出現這種情況說明b點不會處在a所在的scc中,用a點資料更新b點是錯誤的,因此需要加入in_stk的判斷
但是在無向圖中,假設存在一種情況是“一個點a處在某個e-dcc中,另一個點b搜尋到a點時a已經彈棧”,由此構造出下圖,由於是無向邊,在b搜尋到a之前a已經將b搜尋過了,同時邊雙連通分量過程是不允許一條邊走兩次的,因此b走到a的路徑是非法路徑(這是因為無向圖中不存在橫叉邊),也就是說上述假設情況是無法發生的,因此在搜尋到一個已經被搜尋過的點時,無需判斷其是否處在棧中

割點
割點的判定同樣利用\(dfn\)\(low\)兩個標記,對於點x,其是割點有以下情況

  1. x不是根節點(root) && x有兒子y && \(low[y] >= dfn[x]\)
  2. x是根節點 && 在深度搜索樹中x有2個以上的兒子

    注:情況2中給定的條件是“在深度搜索樹中有2個以上兒子”,這不同於在圖上x有2個以上兒子,例如右圖,根節點的確有2個兒子A和B,但A和B之間的連線使得root節點並非割點

無向圖轉邊雙連通分量最少加邊數

例題引入

結論
按照類似有向圖強連通分量縮點的思想,使用Tarjan將圖中邊雙連通分量進行縮點,設縮點後葉子節點

數量為\(cnt\)
注:葉子節點是指度數為1的點

\(最少加邊數 = \lceil \frac{cnt}{2} \rceil = \lfloor \frac{cnt + 1}{2} \rfloor\)

該結論的證明還暫時沒有掌握,感性的理解是如果\(cnt\)為偶數,那麼葉子節點兩兩連邊從而與根節點形成環路保證其稱為邊雙連通分量;如果\(cnt\)為奇數,那麼前偶數個葉子節點實行之前的操作,最後一個節點直接連向根節點

演算法流程

  1. 將邊雙連通分量進行縮點
  2. 統計各邊雙連通分量度數
  3. 計算葉子節點個數並計算出答案