1+ function SCCVertex ( u , disc , low , st , stackMember , carry )
2+ {
3+ graphTracer . _visit ( u ) . _wait ( ) ;
4+
5+ disc [ u ] = ++ carry . time ;
6+ discTracer . _notify ( u , carry . time ) . _wait ( ) ;
7+
8+ low [ u ] = carry . time ;
9+ lowTracer . _notify ( u , carry . time ) . _wait ( ) ;
10+
11+ st . push ( u ) ;
12+ stTracer . _setData ( st ) . _wait ( ) ;
13+
14+ stackMember [ u ] = true ;
15+ stackMemberTracer . _notify ( u , true ) . _wait ( ) ;
16+
17+ // Go through all vertices adjacent to this
18+ for ( var v = 0 ; v < G [ u ] . length ; v ++ ) {
19+ if ( G [ u ] [ v ] ) {
20+
21+ // If v is not visited yet, then recur for it
22+ if ( disc [ v ] == - 1 ) {
23+ SCCVertex ( v , disc , low , st , stackMember , carry ) ;
24+
25+ // Check if the subtree rooted with 'v' has a
26+ // connection to one of the ancestors of 'u'
27+ low [ u ] = Math . min ( low [ u ] , low [ v ] ) ;
28+ lowTracer . _notify ( u , low [ u ] ) ;
29+ }
30+
31+ // Update low value of 'u' only of 'v' is still in stack
32+ // (i.e. it's a back edge, not cross edge).
33+ else if ( stackMember [ v ] == true ) {
34+ low [ u ] = Math . min ( low [ u ] , disc [ v ] ) ;
35+ lowTracer . _notify ( u , low [ u ] ) . _wait ( ) ;
36+ }
37+
38+ }
39+ }
40+
41+ // head node found, pop the stack and print an SCC
42+ var w = 0 ; // To store stack extracted vertices
43+ if ( low [ u ] == disc [ u ] ) {
44+
45+ while ( st [ st . length - 1 ] != u ) {
46+ w = st . pop ( ) ;
47+ stTracer . _setData ( st ) . _wait ( ) ;
48+
49+ logger . _print ( w ) . _wait ( ) ;
50+
51+ stackMember [ w ] = false ;
52+ stackMemberTracer . _notify ( w , false ) . _wait ( ) ;
53+ }
54+
55+ w = st . pop ( ) ;
56+ stTracer . _setData ( st ) . _wait ( ) ;
57+
58+ logger . _print ( w ) . _wait ( ) ;
59+ logger . _print ( '------' ) ;
60+
61+ stackMember [ w ] = false ;
62+ stackMemberTracer . _notify ( w , false ) . _wait ( ) ;
63+ }
64+ }
65+
66+ function SCC ( )
67+ {
68+ var disc = new Array ( G . length ) ;
69+ var low = new Array ( G . length ) ;
70+ var stackMember = new Array ( G . length ) ;
71+ var st = [ ] ;
72+ var carry = { time : 0 } ;
73+
74+ for ( var i = 0 ; i < G . length ; i ++ ) {
75+ disc [ i ] = - 1 ;
76+ low [ i ] = - 1 ;
77+ stackMember [ i ] = false ;
78+ }
79+
80+ discTracer . _setData ( disc ) ;
81+ lowTracer . _setData ( low ) ;
82+ stackMemberTracer . _setData ( stackMember ) ;
83+ stTracer . _setData ( st ) ;
84+
85+ for ( var i = 0 ; i < G . length ; i ++ ) {
86+ if ( disc [ i ] == - 1 ) {
87+ SCCVertex ( i , disc , low , st , stackMember , carry ) ;
88+ }
89+ }
90+ }
0 commit comments