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...