解法一:DFS
need to take this class what I need to take first
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<int> taken(numCourses, 0);
vector<vector<int>> graph(numCourses, vector<int>{});
for(auto a: prerequisites){
graph[a.first].push_back(a.second);
}
for(int i=0;i<numCourses;i++){
if(taken[i]==1) continue;
if(!pre(i, graph, taken)) return false;
}
return true;
}
bool pre(int course, vector<vector<int>>& graph, vector<int>& taken){
vector<int> t = graph[course];
taken[course] = -1;
for(int i=0;i<t.size();i++){
int c = t[i];
if(taken[c]==1) continue;
if(taken[c]==-1) return false;
if(!pre(c, graph, taken)) return false;
}
taken[course] = 1;
return true;
}
};
解法二:BFS
after taking this class what new classes I can take now
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<int> pre(numCourses, 0);
vector<vector<int>> graph(numCourses, vector<int>{});
queue<int> q;
for(auto a: prerequisites){
graph[a.second].push_back(a.first);
pre[a.first]++;
}
for(int i=0;i<numCourses;i++){
if(pre[i]==0) q.push(i);
}
while(!q.empty()){
int t = q.front();
q.pop();
for(auto a:graph[t]){
pre[a]--;
if(pre[a]==0) q.push(a);
}
}
for(int i=0;i<numCourses;i++){
if(pre[i]!=0) return false;
}
return true;
}
};