1. 程式人生 > 其它 >無向圖的割點與橋

無向圖的割點與橋

定義

割點:給定一無向連通圖,對於其中一點 \(u\),若從圖中刪掉 \(u\) 和所有與 $u 相連的邊後,原圖分裂成成 \(2\) 個或以上不相連的子圖,則稱 \(u\) 為原圖的割點(或割頂)。

割邊:給定一無向連通圖,對於其中一邊 \((u,v)\),若從圖中刪掉 \((u,v)\) 後,原圖分裂成 \(2\) 個或以上不相連的子圖,則稱 \((u,v)\) 為原圖的割邊(或橋)。

\(Tarjan\) 演算法可以在 \(O(n)\) 內求出所有割點與割邊。

割點

對於無向圖的每一個聯通塊,我們可以把他看成一棵樹,即把我們假定的根節點拎起來。

先思考,怎樣才能判斷出從圖中刪掉 \(u\)

和所有與 $u 相連的邊後,原圖會不聯通。

根據之前求 強連通分量 時對 \(dfn\)[1]\(low\)[2] 的定義。

\(u\) 是割點,則 \(u\) 滿足一下任一條件:

  • 若 uu 不是搜尋樹的根節點,則 uu 是割點當且僅當樹上至少有 uu 的 11 個子節點 vv 滿足:
    dfn(u)\le low(v)
    dfn(u)≤low(v)
  • \(u\) 是根節點且 \(u\) 至少有 \(2\) 個子節點滿足上述條件。

dfn(u)\le low(v)dfn(u)≤low(v) 說明從 subtree(v)subtree(v) 出發,若不經過 uu,則無法到達比 uu 的 dfndfn 更小的節點,那麼我們把 uu 刪掉,原圖就被分成了 subtree(v)subtree(v) 和剩下的節點至少 22 個子圖。


  1. \(dfsn[u]\):深度優先搜尋遍歷時結點 \(u\) 被搜尋的次序(也稱為 \(dfs\) 序)。 ↩︎

  2. \(low[u]\):定義為 \(u\) 所在子樹的節點經過最多一條非樹邊 \(u \to v\) (其中 \(v\) 必須可達 \(u\) )能到達的節點中最小的 \(dfs\) 序。 ↩︎