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