首先簡單介紹一下強連通分量的概念,簡單點說就是乙個有向圖裡面,強連通分量裡面任意兩個點之間的可以互相抵達,則這些點和邊組成的子圖是乙個強連通分量。
網上搜到的演算法講解都是將該演算法描述為乙個縮點的過程,但是具體講解時卻總是感覺很亂,其實可以更加簡單地描述該演算法,我的想法本質上與縮點其實是一致的,但是我更願意將tarjan演算法的過程描述為乙個將同乙個強連通分量上的點打上相同標記的演算法。
我們只要理解了強連通分量在圖中到底意味著什麼,tarjan演算法其實就迎刃而解了,那強連通分量到底意味著什麼呢?既然有強連通分量,那麼也就一定有非強連通分量,而這兩者的差別就是tarjan演算法的核心。對於 強連通分量來說,我們在dfs遍歷的過程中一定會對強連通分量中的某個點遍歷到兩次(因為強連通分量中一定存在圈),而對於非強連通分量我們則不可能遍歷到乙個點超過1次,那麼對於強連通分量來說,我們在遍歷到乙個點兩次後,我們可以在dfs返回的時候將同乙個強連通分量上的點都設定為同乙個值?但是我們應該怎麼實現呢?
我們用first儲存發現時間,用low儲存強連通分支的標記,同乙個強連通分支中的點low值相同,且等於first最小的點的first值。
實現的方法就是我們將所有的點的值都設定為被訪問到兩次點的發現時間即可,此時我們可以比較dfs返回值與當前值的關係,如果當前first值的發現時間小於返回值,那麼證明該點一定在環上,我們將該點的low值也設定為返回值。
tarjan演算法詳解
參考 tarjan演算法在強連通分量分離中運用很廣,書寫簡單,並且可以拓展到圖的割點,割邊上,十分強大 具體思路 令dfn u 表示當前點的時間戳 low u 表示當前點所能到達的點的時間戳中最小的乙個 到達點u時,將其入棧 拓展點u後代 當且僅當dfn u low u 時,棧頂元素全部出棧,此時出...
Tarjan演算法詳解
tarjan演算法的用途 1.求橋和割點 2.求點和邊的雙連通分量 3.求強連通 targan演算法的流程 利用dfs來遍歷圖來構建一種數型的結構 tarjan演算法的兩個核心陣列 1 對於第一種用途 tarjan演算法原理 我們從1開始遍歷,發現6,5,4的low不小於dfn 3 故3為割點 即4...
Tarjan演算法詳解
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 所以我們在回溯的過程中就能夠通過判...