Tarjan演算法詳解

2021-08-01 16:41:09 字數 1319 閱讀 9583

在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通(strongly connected)。如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量(strongly connected components)。

所以我們在回溯的過程中就能夠通過判斷節點的low值和dfn值是否相等來判斷是否已經找到乙個子連通圖。由於該連通圖中   的dfn值和low值相等的節點是該連通圖中第乙個被訪問到的節點,又根據棧的特性,則該節點在最裡面。所以能夠通過不停   的彈棧,直到彈出該dfn值和low值相同的節點來彈出該連通圖中所有的節點。

tarjan演算法的c++實現**如下,可以配合上面的圖加以理解:

[cpp]view plain

copy

#include

using

namespace

std;  

intdfn[105];                                  

//記錄在做dfs時節點的搜尋次序

intlow[105];                                  

//記錄節點能夠找到的最先訪問的祖先的記號

intcount=1;                                   

//標記訪問次序,時間戳

intstack[105];                                

//壓入棧中

inttop=-1;  

intflag[105];                                 

//標記節點是否已經在棧中

intnumber=0;  

intj;  

intmatrix[105][105]=,,,,,};  

intlength;                                    

//圖的長度

void

tarjan(

intu)  

else

//flag在下面的do while中已經設為0了(即已經從棧中剔除了)

}  }  

//往後回溯的時候,如果發現dfn和low相同的節點,就可以把這個節點之後的節點全部彈棧,構成連通圖

if(dfn[u]==low[u])while

(j!=u);  

cout<}  

}  int

main()  

return

0;  

}  

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演算法詳解

tarjan是用來解決圖的割邊割點問題以及有向圖的強連通分量 縮點 的問題的。割邊是圖論演算法中一類很常見的問題 在乙個連通圖g中,假設有一條邊e,去掉e後圖g不再連通,那麼e就是g的一條割邊。換句話說,g是連通圖,g e不是連通圖。最暴力最暴力的演算法就是每次都去掉一條邊,然後進行dfs深度優先遍...