export default function canFinish( numCourses: number, prerequisites: number[][], ): boolean { const dependents: Map = new Map(); const indegress: Map = new Map(); for (const [child, parent] of prerequisites) { const array = dependents.get(parent) ?? []; array.push(child); dependents.set(parent, array); indegress.set(child, (indegress.get(child) ?? 0) + 1); } const queue: number[] = Array.from(Array(numCourses).fill(0).keys()).filter( (i) => !indegress.has(i), ); let result: number = 0; while (queue.length) { const u = queue.shift() as number; result++; for (const v of dependents.get(u) ?? []) { const degree = (indegress.get(v) ?? 0) - 1; indegress.set(v, degree); if (degree === 0) queue.push(v); } } return result === numCourses; }