Skip to content

Commit eb71d22

Browse files
authored
Create 1136-parallel-courses.js
1 parent a0638ea commit eb71d22

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

1136-parallel-courses.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
}

0 commit comments

Comments
 (0)