原题地址
题目内容
题目分析
题目的意思为,在上某一门课前,可能会需要有前导课程,假设某学生需要上N门课,给出课程的前导课程,问是否能修完。大概就是判断一个图里面有没有环,有环的话就无法修完。首先遍历整个图,将每个节点的入度记录下来,维护一个队列,记录当前入度为0的节点,队列每弹出一个节点就对整个图的入度做一次修改,弹出的节点保存在res队列中,表示该门课程可以修完,最后看res的size是否与N相同。
代码实现
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
int indegree[numCourses] = {0};
for(auto edge:prerequisites){
indegree[edge.first]++;
}
queue<int> temp;
queue<int> res;
for(int i = 0; i < numCourses; i++){
if(indegree[i] == 0){
temp.push(i);
}
}
while(temp.size()){
int num = temp.front();
temp.pop();
res.push(num);
for(auto edge:prerequisites){
if(edge.second == num){
indegree[edge.first]--;
if(indegree[edge.first] == 0){
temp.push(edge.first);
}
}
}
}
return res.size() == numCourses;
}
};