模板 雙連通分量

2022-05-07 21:27:11 字數 1114 閱讀 8990

邊雙連通

dfs找橋並判斷邊雙連通

首先,對原圖進行 dfs。

如上圖所示,黑色與綠色邊為樹邊,紅色邊為非樹邊。每一條非樹邊連線的兩個點都對應了樹上的一條簡單路徑,我們說這條非樹邊 覆蓋 了這條樹上路徑上所有的邊。綠色的樹邊 至少 被一條非樹邊覆蓋,黑色的樹邊不被 任何 非樹邊覆蓋。

我們如何判斷一條邊是不是橋呢?顯然,非樹邊和綠色的樹邊一定不是橋,黑色的樹邊一定是橋。

如何用演算法去實現以上過程呢?首先有乙個比較暴力的做法,對於每一條非樹邊,都逐個地將它覆蓋的每一條樹邊置成綠色,這樣的時間複雜度為 。

怎麼優化呢?可以用差分。對於每一條非樹邊,在其樹上深度較小的點處打上 -1 標記,在其樹上深度較大的點處打上 +1 標記。然後 求出每個點的子樹內部的標記之和。對於乙個點u其子樹內部的標記之和等於覆蓋了u和u的父親p之間的樹邊的非樹邊數量。若這個值非0,則u和u的父親p之間的樹邊不是橋,否則是橋。

用以上的方法 求出每條邊分別是否是橋後,兩個點是邊雙連通的,當且僅當它們的樹上路徑中不包含橋。

意思是dfs然後順帶打上差分,再dfs順帶求出子樹內部標記之和(dfs記錄子樹大小然後dfs序字首和作差),把這個和標記在u節點上,那麼除了根節點以外每個節點都指定一條樹邊。最後跑一次樹剖驗證路徑和為0。

點雙連通

dfs 找割點並判斷點雙連通

如上圖所示,黑色邊為樹邊,紅色邊為非樹邊。每一條非樹邊連線的兩個點都對應了樹上的一條簡單路徑。

考慮一張新圖,新圖中的每乙個點對應原圖中的每一條樹邊(在上圖中用藍色點表示)。對於原圖中的每一條非樹邊,將這條非樹邊對應的樹上簡單路徑中的所有邊在新圖中對應的藍點連成乙個連通塊(這在上圖中也用藍色的邊體現出來了)。

這樣,乙個點不是橋,當且僅當與其相連的所有邊在新圖中對應的藍點都屬於同乙個連通塊。兩個點點雙連通,當且僅當它們在原圖的樹上路徑中的所有邊在新圖中對應的藍點都屬於同乙個連通塊。

藍點間的連通關係可以用與求邊雙連通時用到的差分類似的方法維護,時間複雜度o(n+m)。

雙連通分量

在無向連通圖中,如果刪除該圖的任何乙個結點都不能改變該圖的連通性,則稱該圖是雙連通的。雙連通無向圖一定是連通的,而連通的無向圖則不一定是雙連通的。對於乙個連通的無向圖也有雙連通分量的概念,定義自然不言而喻。同樣,我們也可以利用tarjan演算法求雙連通分量。define n 10000 struct...

雙連通分量

在乙個無向連通圖中,如果任意去掉乙個定點i及依附於i的所有邊後得到的圖仍然連通,則稱該圖為 2 連通圖 否則,若得到多個連通分量,則該圖不是雙連通的,頂點i被稱為 割點 簡單的說,在雙連通圖中,任何一對頂點都至少存在兩條路徑可以互相到達。圖的連通 性不會任何乙個頂點的影響。這個性質具有許多重要的應用...

雙連通分量

雙連通分量就是無向圖中的強連通分量,基本就是找割頂和橋。割頂就是乙個點,如果把它取掉,連通分量數量就會增加,橋就是一條邊,同理。對於乙個連通圖,如果任意兩點至少存在兩條 點不重複 的路徑,也就是任意兩條邊都在乙個簡單環中,即內部無割頂,則說這個圖是點雙連通的。對於乙個連通圖,如果任意兩點至少存在兩條...