@@ -333,7 +333,7 @@ class Graph<T> {
333
333
} ;
334
334
335
335
// Adds both u and v verteces and their edge w
336
- addVertecesAndEdge = ( u : T , v : T , w = 0 , d = true ) => {
336
+ addVertecesAndEdge = ( u : T , v : T , w = 1 , d = true ) => {
337
337
this . addVertex ( u ) ;
338
338
this . addVertex ( v ) ;
339
339
if ( d ) {
@@ -525,9 +525,8 @@ class Graph<T> {
525
525
} else {
526
526
split = line . trim ( ) . split ( " " ) ;
527
527
if ( ! w ) {
528
- g . addVertecesAndEdge ( split [ 0 ] , split [ 1 ] , 0 , d ) ;
528
+ g . addVertecesAndEdge ( split [ 0 ] , split [ 1 ] , 1 , d ) ;
529
529
} else {
530
- // Avoid duplications!
531
530
g . addVertecesAndEdge ( split [ 0 ] , split [ 1 ] , parseInt ( split [ 2 ] ) , d ) ;
532
531
}
533
532
@@ -537,7 +536,11 @@ class Graph<T> {
537
536
// check if the last line is empty
538
537
if ( line !== "" ) {
539
538
split = line . trim ( ) . split ( " " ) ;
540
- g . addVertecesAndEdge ( split [ 0 ] , split [ 1 ] ) ;
539
+ if ( ! w ) {
540
+ g . addVertecesAndEdge ( split [ 0 ] , split [ 1 ] , 1 , d ) ;
541
+ } else {
542
+ g . addVertecesAndEdge ( split [ 0 ] , split [ 1 ] , parseInt ( split [ 2 ] ) , d ) ;
543
+ }
541
544
}
542
545
return g ;
543
546
} ;
@@ -562,7 +565,7 @@ class Graph<T> {
562
565
563
566
// Returns: a list of all verteces found (in the order of dequeue)
564
567
// the parent of each visited vertex
565
- // the distance of s to each visited vertex
568
+ // the distance from s to each visited vertex
566
569
// all visited verteces
567
570
bfs = ( s : T ) => {
568
571
// the order of each vertex is dequeue (Array of Keys)
@@ -619,56 +622,66 @@ class Graph<T> {
619
622
} ;
620
623
621
624
// dfs iterative
625
+ // Returns: a list of all verteces found (in the order of dequeue)
626
+ // the parent of each visited vertex
627
+ // all visited verteces
622
628
dfs = ( s : T ) => {
629
+ // popped stack order
623
630
const result : Array < T > = new Array ( ) ;
624
- const dist : Map < T , number > = new Map ( ) ;
625
631
const parents : Map < T , null | T > = new Map ( ) ;
632
+ // a node is visited when it is popped from the stack
626
633
const visited : Map < T , boolean > = new Map ( ) ;
627
- // key to label order
628
- const labeledOrder : Map < T , number | null > = new Map ( ) ;
629
- // finish order
630
- const finish : Array < T > = new Array ( ) ;
631
634
const stack = new Stack ( ) ;
632
- // add s tothe stack
633
635
stack . push ( s ) ;
634
- // mark s as visited
635
- visited . set ( s , true ) ;
636
- dist . set ( s , 0 ) ;
636
+ parents . set ( s , null ) ;
637
637
let v : Node ;
638
- let i = 0 ;
638
+
639
639
while ( stack . size !== 0 ) {
640
640
// take from the top of the stack
641
641
v = stack . pop ( ) ! ;
642
- result . push ( v . key ) ;
643
- // add parent of v wich is the last one poped
644
- if ( i === 0 ) {
645
- parents . set ( v . key , null ) ;
646
- } else {
647
- parents . set ( v . key , result [ i - 1 ] ) ;
642
+ if ( ! visited . get ( v . key ) ) {
643
+ result . push ( v . key ) ;
644
+ visited . set ( v . key , true ) ;
648
645
}
649
- i ++ ;
650
- // for every edge of v
651
646
this . list . get ( v . key ) ! . forEach ( ( u ) => {
652
- // v unvisited
653
647
if ( ! visited . get ( u . node ) ) {
654
- // mark u as visited
655
- visited . set ( u . node , true ) ;
656
- // add u to the stack
648
+ parents . set ( u . node , v . key ) ;
657
649
stack . push ( u . node ) ;
658
- // calc dist
659
- dist . set ( u . node , dist . get ( v . key ) ! + 1 ) ;
660
650
}
661
651
} ) ;
662
- if ( ! labeledOrder . get ( v . key ) ) {
663
- labeledOrder . set ( v . key , this . currentLabel ) ;
664
- this . currentLabel ! ++ ;
665
- finish . push ( v . key ) ;
666
- }
667
652
}
668
653
return {
669
654
result,
670
655
parents,
671
- dist,
656
+ visited,
657
+ } ;
658
+ } ;
659
+
660
+ // dfs recursive
661
+ // Returns: a list of all verteces found (in the order of dequeue)
662
+ // the parent of each visited vertex
663
+ // all visited verteces
664
+ dfsRec = (
665
+ s : T ,
666
+ visited : Map < T , boolean > = new Map ( ) ,
667
+ labeledOrder : Map < T , number | null > = new Map ( ) ,
668
+ finish : Array < T > = new Array ( )
669
+ ) => {
670
+ // mark s as visited
671
+ visited . set ( s , true ) ;
672
+ // for every edge of s
673
+ this . list . get ( s ) ! . forEach ( ( u ) => {
674
+ if ( ! visited . get ( u . node ) ) {
675
+ // recursive call
676
+ this . dfsRec ( u . node , visited , labeledOrder , finish ) ;
677
+ }
678
+ } ) ;
679
+ if ( ! labeledOrder . get ( s ) ) {
680
+ labeledOrder . set ( s , this . currentLabel ) ;
681
+ this . currentLabel ! -- ;
682
+ finish . push ( s ) ;
683
+ }
684
+ return {
672
685
labeledOrder,
673
686
visited,
674
687
finish,
@@ -682,11 +695,10 @@ class Graph<T> {
682
695
const visited : Map < T , boolean > = new Map ( ) ;
683
696
const finish : Array < T > = new Array ( ) ;
684
697
// to keep track of ordering
685
- this . currentLabel = 0 ;
686
- let r ;
698
+ this . currentLabel = this . list . size ;
687
699
for ( let [ u ] of this . list ) {
688
700
if ( ! visited . get ( u ) ) {
689
- const r = this . dfs ( u ) ;
701
+ const r = this . dfsRec ( u ) ;
690
702
// update values
691
703
r . visited . forEach ( ( value , key ) => {
692
704
visited . set ( key , value ) ;
0 commit comments