在有向圖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深度優先遍...