/** * @param {number} numCourses * @param {number[][]} prerequisites * @return {boolean} */ const canFinish = function (numCourses, prerequisites) { }; /* 这个题目是一个典型的拓扑排序问题,只需要判断拓扑排序最终能否输出所有元素,如果可以则表明是一个有向无环图,符合 题目要求,否则不符合 */ function f1(numCourses, prerequisites) { const graph = Array.from({ length: numCourses }, () => []); const inDegree = Array(numCourses).fill(0); // 构建图和入度表 for (const [a, b] of prerequisites) { graph[b].push(a); inDegree[a]++; } // 找出入度为零的顶点,将其加入队列 const queue = []; for (let i = 0; i < numCourses; i++) { if (inDegree[i] === 0) queue.push(i); } // 从队列中输出所有入度为零的顶点,如果输出的顶点数量和课程数量一致,表明可以拓扑排序,否则有环 let count = 0; while (queue.length > 0) { const node = queue.shift(); count++; for (const neighbor of graph[node]) { inDegree[neighbor]--; if (inDegree[neighbor] === 0) queue.push(neighbor); } } return count === numCourses; }