求強連通分量Tarjan演算法

2022-06-02 05:00:15 字數 1077 閱讀 4101

int  dfn[16];       //

時間戳int dfn_num = 0; //

時間 int low[16]; //

節點u所能訪問到的最小時間戳

int inst[16]; //

節點u是否在棧中.

int st[16

];int top = 0

; //

我們維護的資訊.

int col[16]; //

給節點染色, 同乙個連通塊的節點應該是同乙個顏色的.

int col_num = 0; //

顏色值.

int size[16]; //

每個顏色值所擁有的塊數.

/*第一步: 訪問當前節點的所有子節點: 子節點有三種

第一種: 未訪問過的, 我們對它進行訪問, 同時設定它的時間戳dfn[u]和low[u]為++ndfn_num,以及進棧.

第二種: 訪問過的,並且在棧中,我們直接更新我們 當前 節點的low --> 注意 應該用low[u] 和 dfn[v]比較.

第三種: 訪問過的,並且不在棧中的, 我們直接跳過.因為這個時候,所以它已經染色了,屬於乙個連通塊了.

第二步: 如果dfn[u] == low[u] 說明 已經找到乙個連通塊了.

這時候我們要將棧頂元素彈出,直到當前節點. 記得也要修改inst, 同時維護我們需要的資訊.

*/void tarjan(int

u)

else

if(inst[v])

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

while (st[top--] !=u);

}}

簡單資料 

input: 

6 81 3

3 55 6

4 64 1

1 22 4

3 4out:

low : 1 1 3 1 6 4

col : 3 3 3 3 2 1

size: 1 1 4 0 0 0

板子題:  

強連通分量 tarjan求強連通分量

雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...

tarjan 演算法 求強連通分量)

全網最詳細tarjan演算法講解,我不敢說別的。反正其他tarjan演算法講解,我看了半天才看懂。我寫的這個,讀完一遍,發現原來tarjan這麼簡單!tarjan演算法,乙個關於 圖的聯通性的神奇演算法。基於dfs 迪法師 演算法,深度優先搜尋一張有向圖。注意!是有向圖。根據樹,堆疊,打標記等種種神...

Tarjan演算法求強連通分量

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