再次深搜:
此時 stack =
發現綠邊指向了已經遍歷過的點4 => 是上述的2種邊之一
而4在棧中 => 4點與6點是父子關係
=> 該邊為後向邊
=>4->6的路徑上的點都是環。
int num[n], top = 0;
int u = stack.top();
while(u!=4)
num[top++] = u;
如此就能把stack中 4->6路徑上的點轉移到num陣列裡
顯然num陣列中的點是乙個連通分量。
實際情況可能更複雜:
出現了大環套小環的情況,顯然我們認為最大環是乙個強連通分量(即: )
因而我們需要強化一下dfs過程:
定義:int time, dfn[n], low[n];
dfn[i]表示 遍歷到 i 點時是第幾次dfs
low[u] 表示 以u點為父節點的 子樹 能連線到 [棧中] 最上端的點 的dfn值(換句話說,是最小的dfn,因為最上端的dfn是最小的嘛)
int stack[n], top; //上述的棧
具體過程詳見模版。
tarjan求強連通分量及縮點
一 概念 什麼是連通 強連通 弱連通?這裡有比較好理解的概念 二 方法 所涉及的內容皆圍繞cf999e 我們在計算強連通分量的時候會用到的工具 三 縮點 前面已經提到強連通分量的定義,即任意i點可以到達任意j點 那麼要是在強連通分量中再新增路徑就沒有必要 所以就可以把同屬於乙個強連通分量的節點看為同...
Tarjan求連通分量 縮點
1.強連通 在乙個圖中對於任意兩個點都可以互相到達那麼就稱這個圖為強連通圖。連通分量 乙個圖的極大強連通子圖,稱為強連通分量 乙個連通分量比較類似於乙個集合,裡面的任點都可以互相到達 縮點 把乙個連通分量整體看作是乙個節點,那麼這個節點就是縮點 2.tarjan演算法 考慮維護三個陣列 vis,df...
POJ 1236 tarjan 強連通分量 縮點
poj1236 問,對於乙個dag 又向無環圖 1.至少要選幾個點,才能從這些點出發到達所有點 2.至少加入幾條邊,就能從圖中任何乙個點出發到達所有點 先求dag的強連通分量數,再縮點,可以用tarjan演算法來做。第乙個問題 不難想到答案就是縮點之後入度為0的點的個數 第二個問題 設縮點後入度為0...