Professional Documents
Culture Documents
Hong Vn Thin
Tm tt ni dung
Thut ton Tarjan c hai ng dng chnh: Tm khp v cu trong th v hng, v
Tm thnh phn lin thng mnh trong th c hng.
V d m u
Cho mt th lin thng v hng G = (V, E). Mi nh v cnh c thng s cho bit chi ph
ph hy i tng . Tm nh hoc cnh bin G thnh th khng lin thng.
1.1 nh ngha
th v hng lin thng khi v ch khi tn ti ng i gia mi cp nh.
Thnh phn lin thng ca mt th l mt th con trong gia bt k hai nh no
u c ng i n nhau, v khng th nhn thm bt k mt nh no m vn duy tr
tnh cht trn
Khp: l nh m nu ta b n (cng cc cnh lin thuc vi n) ra khi th, s thnh
phn lin thng ca th s tng ln.
Cu: l cnh m nu ta b n ra khi th, s thnh phn lin thng ca th s tng
ln.
th song lin thng: th khng c khp.
T tin ca mt nh c th l cha ca n, hoc l chnh n.
Back edge: Cnh a nh hin ti trong hm DFS quay v mt nh c duyt t
trc.
1.2 tng
Mt cch ngn gn, thut ton Tarjan p dng DFS hnh thnh cy DFS.
Trn cy DFS, nh c thm trc gi l nh cha.
Nu con ca mt nh khng c ng i (thng qua back edge hoc/v dy nh con) v
cha ca nh ny, th nh ny l khp. V nu b nh ny i, con ca n khng th n cha
ca n.
Ngoi l, nh gc ca cy DFS l khp nu v ch nu c t hai con trc tip tr ln.
1
1.3 Thut ton
Thut ton Tarjan, theo nhn xt ca John Edward Hopcroft v Robert Endre Tarjan, l mt bin
th ca DFS, nn phc tp vn l O(V + E).
Nu v cha thm:
(a) Ghi nhn nh u l cha ca nh v trn cy DFS.
(b) Nu nh u l gc ca cy DFS, cp nht s lng con ca n.
(c) DFS(v)
(d) Nu low[v] >= num[u] (t v ch c th i n mt nh t u tr xung trn cy
DFS), th u l khp. V nu khng c u th mi nh t v tr xung khng n
c nhng nh trn u.
(e) Nu low[v] > num[u] (t v ch c th i n mt nh di u nhng khng bao
gm u trn cy DFS) th cnh (u,v) l cu.
2
(f) Ti thiu gi tr low[u] theo gi tr low[v].
Nu v thm (chng ta c mt chu trnh) v v khng phi l cha ca u (chu trnh
c hn 2 nh) th ti thiu low[u] theo num[v].
1 i n t dfsCount = 0 , r o o t = 1 , c h i l d = 0 ;
2 // . . .
3 v o i d tarjanAPB ( i n t u ) {
4 num [ u ] = low [ u ] = ++dfsCount ;
5 f o r ( int v : neighbor [ u ] ) {
6 i f (num [ v ] == 0 ) {
7 parent [ v ] = u ;
8 i f ( u == r o o t ) ++c h i l d ;
9 tarjanAPB ( v ) ;
10 low [ u ] = min ( low [ u ] , low [ v ] ) ;
11 i f ( low [ v ] >= num [ u ] ) AP[ u ] = t r u e ;
12 i f ( low [ v ] > num [ u ] ) b r i d g e . push_back ( make_pair ( u , v ) ) ;
13 } else
14 i f ( p a r e n t [ u ] != v ) {
15 low [ u ] = min ( low [ u ] , num [ v ] ) ; } }
16 }
17 i n t main ( ) {
18 // . . .
19 f o r ( i n t i = 1 ; i <= V; ++i )
20 i f (num [ i ] == 0 ) {
21 root = i ;
22 child = 0;
23 tarjanAPB ( i ) ;
24 AP[ i ] = c h i l d > 1 ; } }
25
V d m u
2.1 nh ngha
3
Thnh phn lin thng yu: th con ti i c ng i gia hai nh bt k trn th
v hng nn.
2.2 tng
Trong qu trnh thm mt nh, sau khi thm xong mi nhnh bng DFS, ta truyn thng
tin v nh cha xa nht n c ca hm quy va thc hin cho nh hin ti.
Khi thm ht cc nhnh, ta kim tra xem ta thm ngc li nh cha trong cc hm
quy va ri hay cha.
4
1 i n t dfsCount = 0 , sccCount = 0 ;
2 v e c t o r <i n t > s c c [V ] ;
3 // . . .
4 v o i d tarjanSCC ( i n t u ) {
5 s t k . push_back ( u ) ;
6 low [ u ] = num [ u ] = ++dfsCount ;
7 onstack [ u ] = true ;
8 f o r ( int v : neighbor [ u ] ) {
9 i f (num [ v ] == 0 ) tarjanSCC ( v ) ;
10 i f ( o n s t a c k [ v ] ) low [ u ] = min ( low [ u ] , low [ v ] ) ;
11 }
12 i f (num [ u ] == low [ u ] ) {
13 ++sccCount ;
14 while (1) {
15 i n t v = s t k . back ( ) ;
16 s c c [ sccCount ] . push_back ( v ) ;
17 onstack [ v ] = f a l s e ;
18 s t k . pop_back ( ) ;
19 i f ( u == v ) break ; } } }
20 i n t main ( ) {
21 // . . .
22 f o r ( i n t i = 1 ; i <= V; ++i )
23 i f (num [ i ] == 0 ) tarjanSCC ( i ) ; }
24
Ht