课程表
你这个学期必须选修 numCourses
门课程,记为 0
到 numCourses - 1
。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites
给出,其中 prerequisites[i] = [ai, bi]
,表示如果要学习课程 ai
则 必须 先学习课程 bi
。
- 例如,先修课程对
[0, 1]
表示:想要学习课程0
,你需要先完成课程1
。
请你判断是否可能完成所有课程的学习?如果可以,返回 true
;否则,返回 false
。
Code
class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
unordered_map<int, vector<int>> graph;
for(int i = 0; i < prerequisites.size(); ++i){
graph[prerequisites[i][1]].push_back(prerequisites[i][0]);
}
// 计算入度
unordered_map<int, int> inDegree;
for(auto mp : graph){
vector<int> vt = mp.second;
for(int i = 0; i < vt.size(); ++i){
inDegree[vt[i]]++;
}
}
// 开始排序
queue<int> que;
for (int i = 0; i < numCourses; ++i) {
if (!inDegree[i]) {
que.push(i);
}
}
int count = 0;
while(!que.empty()){
int node = que.front();
que.pop();
count++;
// 更新该节点的后续节点的入度,然后删除该节点
vector<int> vt = graph[node];
for(int i = 0; i < vt.size(); ++i){
inDegree[vt[i]]--;
if(!inDegree[vt[i]]){
que.push(vt[i]);
}
}
graph.erase(node);
}
return count == numCourses;
}
};