File tree Expand file tree Collapse file tree 1 file changed +35
-0
lines changed Expand file tree Collapse file tree 1 file changed +35
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number } N
3
+ * @param {number[][] } relations
4
+ * @return {number }
5
+ */
6
+ const minimumSemesters = function ( N , relations ) {
7
+ const g = new Map ( ) // key: prerequisite, value: course list.
8
+ const inDegree = new Array ( N + 1 ) . fill ( 0 ) // inDegree[i]: number of prerequisites for i.
9
+ for ( let r of relations ) {
10
+ if ( ! g . has ( r [ 0 ] ) ) g . set ( r [ 0 ] , [ ] )
11
+ g . get ( r [ 0 ] ) . push ( r [ 1 ] ) // construct graph.
12
+ ++ inDegree [ r [ 1 ] ] // count prerequisites for r[1].
13
+ }
14
+ const q = [ ] // save current 0 in-degree vertices.
15
+ for ( let i = 1 ; i <= N ; ++ i ) if ( inDegree [ i ] === 0 ) q . push ( i )
16
+ let semester = 0
17
+ while ( q . length ) {
18
+ // BFS traverse all currently 0 in degree vertices.
19
+ for ( let sz = q . length ; sz > 0 ; -- sz ) {
20
+ // sz is the search breadth.
21
+ const c = q . shift ( )
22
+ -- N
23
+ // c's in-degree is currently 0, but it is not a prerequisite of anyone else.
24
+ if ( ! g . has ( c ) ) continue
25
+ const tmp = g . get ( c )
26
+ g . delete ( c )
27
+ for ( let course of tmp )
28
+ if ( -- inDegree [ course ] === 0 )
29
+ // decrease the in-degree of course's neighbors.
30
+ q . push ( course ) // add current 0 in-degree vertex into Queue.
31
+ }
32
+ ++ semester // need one more semester.
33
+ }
34
+ return N === 0 ? semester : - 1
35
+ }
You can’t perform that action at this time.
0 commit comments