You are on page 1of 5

Thut ton Tarjan

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.

1 Tm khp v cu trong th v 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).

Chng ta nh ngha mt s bin nh sau:

num[u]: Th t duyt ca nh u khi DFS.


low[u]: Gi tr num[u] nh nht t c trong cy DFS con ca nh u.
Ban u, low[u] = num[u]. Gi tr ch c th gim nu duyt c mt chu k c 3 nh
tr ln.
cnt: Bin m th t DFS ca cc nh.

Trn cy DFS, nu nh gc c hai con tr ln th n c tnh l mt khp. Thut ton Tarjan b


qua trng hp c bit ny.

Hnh 1: th v hng Hnh 2: Trnh t duyt DFS

Gii thut DFS nh u c tin hnh nh sau:

1. t num[u] = low[u] = ++cnt.


2. Vi mi nh v k vi u, ta chia ra hai trng hp:

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

2 Tm cc thnh phn lin thng mnh trong th c


hng

V d m u

Trong mng li giao thng thnh ph G = (V, E) c cc ng mt chiu. Thnh ph mun


rng vi hai v tr x v y trong thnh ph, lun c ng t x n y v ngc li. Hy kim tra
xem mng li ny tha mn mun ca h hay cha.

2.1 nh ngha

Trong th c hng, cc nh ngha sau cn phn bit:

Thnh phn lin thng mnh: th con ti i c ng i t mt nh bt k n mt


nh bt k khc.

3
Thnh phn lin thng yu: th con ti i c ng i gia hai nh bt k trn th
v hng nn.

Nh vy, vi v d m u trn, ta cn kim tra xem th cho c ng 1 thnh phn lin


thng hay khng.

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.

Nu cha: ta tm c mt thnh phn lin thng mnh, bao gm cc nh thuc cy


con ca cy DFS tnh t im ny tr xung (tt nhin, b ra nhng nh thuc vo
thnh phn lin thng mnh khc xt trc ).
Ngay lp tc, xa b thnh phn ny khi cy DFS hin ti (cp nht li stack, onstack)
trnh b nhm ln qua li gia cc thnh phn lin thng mnh.

2.3 Thut ton


phc tp: O(V + E)

Chng ta nh ngha mt s bin nh sau:

vector<int> stk: l stack lu tr th t duyt DFS cc nh.


bool onstack[.]: mang gi tr true nu nh nm trong stack v ngc li.

Gii thut thm mt nh u nh sau:

1. Thm u vo stack, nh du onstack, nh s th t DFS ca nh.


2. Vi mi nh v k vi u:

(a) Nu nh cha tng c thm (s th t bng 0): quy thm v.


(b) Nu onstack[v], ti thiu low[u] theo low[v].
3. Nu low[u] == num[u] (khng i ngc ln nh cha c hon thnh mt thnh phn
lin thng mnh):
Khi to mt vng nh cho thnh phn lin thng mi (c th dng vector). Ln lt
xa khi stack cho n khi u b ly ra th ngng. Lu rng ly n u th sa onstack
v thm vo thnh phn lin thng hin ti.

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

You might also like