88 * @return {boolean }
99 */
1010
11+ // http://www.cnblogs.com/Liok3187/p/4752700.html
12+
1113var constructGraph = function ( numNodes , pre ) {
1214 var nodes = [ ] ;
1315 for ( var i = 0 ; i < numNodes ; i ++ ) {
1416 var node = { } ;
1517 node . neighbors = [ ] ;
16- nodes [ i ] = node ;
18+ nodes . push ( node ) ;
1719 }
1820 for ( var j = 0 ; j < pre . length ; j ++ ) {
19- var s = pre [ j ] [ 1 ] ;
20- var d = pre [ j ] [ 0 ] ;
21- nodes [ s ] . neighbors . push ( nodes [ d ] ) ;
21+ var requiredCourse = pre [ j ] [ 1 ] ;
22+ var course = pre [ j ] [ 0 ] ;
23+ // pushing course that require required-course to it's neighbor
24+ // when we go to the required-course, and traverse it's neighbors, we want to make sure that those neighbor doesn't have others that nodes
25+ // that required those neighbor plus those neighbor's required-course
26+ // example [1,0], [0,2], [2,1]
27+ // 1 required 0, 0 required 2, and 2 required 1
28+ // it creates loop
29+ nodes [ requiredCourse ] . neighbors . push ( nodes [ course ] ) ;
2230 }
2331 return nodes ;
2432}
@@ -42,9 +50,13 @@ var canFinish = function(numCourses, prerequisites) {
4250 var nodes = constructGraph ( numCourses , prerequisites ) ;
4351
4452 for ( var i = 0 ; i < nodes . length ; i ++ ) {
45- console . log ( 'nodes i' , nodes [ i ] )
46- var hasCycle = dfs ( nodes [ i ] , [ ] ) ;
53+ var parent = [ ] ;
54+ var hasCycle = dfs ( nodes [ i ] , parent ) ;
55+
56+ console . log ( hasCycle , i , nodes [ i ] , parent )
4757 if ( hasCycle ) return false ;
4858 }
4959 return true ;
50- } ;
60+ } ;
61+
62+ canFinish ( 5 , [ [ 0 , 1 ] , [ 1 , 2 ] , [ 1 , 3 ] , [ 1 , 4 ] , [ 2 , 3 ] ] )
0 commit comments