Tarjan演算法的改裝

2021-05-21 19:14:21 字數 911 閱讀 7367

tarjan演算法是用來解決強連通分量問題的常用演算法,演算法是基於深度優先搜尋的架構,在深度優先搜尋的過程中,迭代地求出各個節點u的標值lowlink(u),其中:lowlink(u)=min(dfn(u),dfn(w))。在這裡,w是從u和u的後代點出發用一條後向弧和橫叉弧所能達到的同乙個強連通分支的節點,dfn(u)是深度優先遍歷中節點u的遍歷序號。

這樣子,我們發現,在求解lowlink(u)時,我們必須考慮u的鄰接節點w與u是否是與u在同乙個連通分支中,這也是演算法的難點。筆者提出了一種比較直觀的判斷w是否與u在同乙個連通分支的演算法,該演算法在效率上可能比經典演算法略遜,但易於理解。下面給出poj2186的主要**:

在這裡,陣列dfn儲存節點的dfn值,陣列low儲存節點的lowlink值,陣列con儲存節點所屬的連通分量的序號,陣列out標記各個節點是否存在出邊連線其他連通分量(由於本題只需要考慮連通分量的出度,所以沒有必要把整個橋儲存下來,只需要儲存橋的起點)。

對於當前遍歷的節點u,以及它的鄰接節點w,我們分兩種情況考慮:

如果dfn[w]=0(初值),也即w還沒有遍歷到:

那麼:我們遍歷w,w遍歷完畢以後:

如果low[w]>dfn[u]:說明從w出發不可能到達u,u和w不在同乙個連通分支中,(u,w)是橋;

否則:u和w在同乙個連通分量中,於是更新low[u]:=min(low[u],low[w]);

如果dfn[w]!=0(初值),也即w在遍歷u之前已經遍歷到了:

此時,還需分兩種情況討論:

如果con[w]=0(初值):說明w還沒有被劃分到乙個連通分量中,那麼u與w應該處於同乙個連通分量,(u,w)是後向邊

或者同乙個連通分量的橫叉邊,於是更新low[u]:=min(low[u],low[w]);

如果con[w]!=0:說明w已經被劃分到同乙個連通分支,u和w不在同乙個連通分支中,(u,w)是橋。

Tarjan演算法的練習

基本介紹 tarjan演算法其實就是一種帶技巧的dfs,比普通的dfs多了兩個標記 dfn和low,實質上還是一種dfs。tarjan演算法能做什麼?求有向圖的強連通分量 求無向圖的割點 求無向圖的橋 割邊 求lca 最近公共祖先 網上有很多的tarjan演算法詳解,這裡就不重複造輪子了。剛學tar...

tarjan演算法詳解

參考 tarjan演算法在強連通分量分離中運用很廣,書寫簡單,並且可以拓展到圖的割點,割邊上,十分強大 具體思路 令dfn u 表示當前點的時間戳 low u 表示當前點所能到達的點的時間戳中最小的乙個 到達點u時,將其入棧 拓展點u後代 當且僅當dfn u low u 時,棧頂元素全部出棧,此時出...

Tarjan 演算法筆記

tarjan演算法 tarjan演算法屬於圖論中的乙個演算法,主要用來求乙個圖中的強連通分量,之後就可以做很多事,比如說縮點 求雙聯通分支等。強連通 在乙個有向圖中,對於幾個點,如果它們能夠互相到達,那麼稱它們強連通。強連通分量 可以這樣理解 把乙個圖里的點分成幾坨,每坨中的點都能夠互相到達 他們強...