強連通分量及縮點tarjan演算法解析
強連通定義:在有向圖G<V,E>中,對於點集V'∈V, 點集中的任意兩點都可達,則稱V'為強連通。
孤立的一個點也是一個強連通分量
在巢狀的多個環時 : {所有環上的點}為一個強連通分量( 最小環就是每個孤立點)注意一定是滿足條件的最大點集。
則上圖中強連通分量有 {1},{2},{3},{7},{4,5,6}
---------------------------------------------------------------------------
tarjan的過程就是dfs過程
對圖dfs一下,遍歷所有未遍歷過的點 ,會得到一個有向樹,顯然有向樹是沒有環的。(注意搜過的點不會再搜)
則能產生環的 只有(指向已經遍歷過的點)的邊
如左圖,只有紅色與綠色邊有可能產生環。
對於深搜過程,我們需要一個棧來儲存當前所在路徑上的所有點(棧中所有點一定是有父子關係的)
再仔細觀察紅邊與綠邊,首先得到結論:紅邊不產生環,綠邊產生環
1、對於紅邊,連線的兩個點3、7沒有父子關係,這種邊稱為橫叉邊。
橫叉邊一定不產生環。
2、對於綠邊,連線的兩個點6、4是父子關係,這種邊稱為後向邊。
環一定由後向邊產生。
3、圖中除了黑色的樹枝邊,一定只有橫叉邊和後向邊(不存在其他種類的邊)
-------------------------------------------------------------------------
則以下考慮對於這兩種邊的處理和判斷:
首先深搜會搜到這樣的圖:
Stack = {1,2,3},3沒有多餘的其他邊,因此3退棧,把3作為一個強連通分量
-------------------------------------------------------------------------
再次深搜:
此時棧 Stack = {1,2,7}
發現紅邊指向了已經遍歷過的點3 => 是上述的2種邊之一
而3不在棧中 => 3點與7點無父子關係
=> 該邊為橫叉邊
=>採取無視法。
繼而7點退棧 產生連通分量{7}
繼而2點退棧 產生連通分量{2}
--------------------------------------------------------------------------------------
再次深搜:
此時 Stack = {1,4,5,6}
發現綠邊指向了已經遍歷過的點4 => 是上述的2種邊之一
而4在棧中 => 4點與6點是父子關係
=> 該邊為後向邊
=>4->6的路徑上的點都是環。
int num[N], Top = 0;
int u = Stack.top();
while(u!=4){ num[Top++] = u; Stack.pop(); u = Stack.top();}
num[Top++] = u;
如此就能把Stack中 4->6路徑上的點轉移到num陣列裡
顯然num陣列中的點是一個連通分量。
-------------------------------------------------------------------------
實際情況可能更復雜:
出現了大環套小環的情況,顯然我們認為最大環是一個強連通分量(即:{4,5,6,8} )
因而我們需要強化一下dfs過程:
定義:
int Time, DFN[N], Low[N];
DFN[i]表示 遍歷到 i 點時是第幾次dfs
Low[u] 表示 以u點為父節點的 子樹 能連線到 [棧中] 最上端的點 的DFN值(換句話說,是最小的DFN,因為最上端的DFN是最小的嘛)
int Stack[N], top; //上述的棧
具體過程詳見模版。
相關文章
- 【模板】tarjan 強連通分量縮點
- 強連通分量及縮點 演算法解析及例題演算法
- 圖之強連通、強連通圖、強連通分量 Tarjan演算法演算法
- POJ 2186 Popular Cows(強連通分量縮點,Tarjan演算法)演算法
- 強連通分量(Tarjan演算法)演算法
- 圖論複習之強連通分量以及縮點—Tarjan演算法圖論演算法
- 強連通分量與縮點(Tarjan演算法)(洛谷P3387)演算法
- Tarjan演算法(強連通分量分解)演算法
- 強連通------tarjan演算法詳解及與縮點聯合運用演算法
- 圖論——強連通分量(Tarjan演算法)圖論演算法
- Tarjan演算法求強連通分量總結演算法
- 強連通分量-tarjan演算法模板詳解演算法
- HDU 2767 Proving Equivalences Tarjan 強連通縮點UI
- 演算法學習之路|強連通分量+縮點演算法
- kosaraju 和 tarjan演算法詳解(強連通分量)演算法
- Tarjan演算法三大應用之強連通分量演算法
- 【演算法學習】tarjan 強連通、點雙、邊雙及其縮點 重磅來襲!!!!演算法
- Tarjan 求有向圖的強連通分量
- Trajan演算法(強連通+縮點)演算法
- 尋找圖的強連通分量:tarjan演算法簡單理解演算法
- 20行程式碼實現,使用Tarjan演算法求解強連通分量行程演算法
- Tarjan演算法_縮點演算法
- HDU2767Proving Equivalences[強連通分量 縮點]UI
- 強連通演算法--Tarjan個人理解+詳解演算法
- tarjan演算法求scc & 縮點演算法
- 連通圖與Tarjan演算法演算法
- 強連通分量
- 【筆記】tarjian演算法 求強連通分量筆記演算法
- 連通圖演算法詳解之① :Tarjan 和 Kosaraju 演算法演算法
- Tarjan縮點題單 刷題題解
- 強連通圖的演算法演算法
- tarjan縮點-受歡迎的牛-筆記筆記
- 【Tarjan 拓撲排序 dp】P3387 【模板】縮點排序
- 求有向圖的強連通分量(c語言版)C語言
- 【Tarjan SCC 加邊使得所有圖聯通 至少選取多少個點能圖聯通 】Network of Schools加強版.md
- POJ 1523-SPF(Tarjan演算法-關節點)演算法
- 抓間諜(強連通)
- 邊分治維護強連通分量(CF1989F,P5163)