207. Course Schedule
There are a total of n courses you have to take, labeled from 0
to n
- 1
.
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]
Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?
For example:
2, [[1,0]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.
2, [[1,0],[0,1]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.
Note:
- The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
- You may assume that there are no duplicate edges in the input prerequisites.
class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<vector<int>> g (numCourses,vector<int>(0));
vector<int> visit (numCourses,0);
for(auto a :prerequisites){
g[a.first].push_back(a.second);
}
for(int i = 0 ; i <numCourses ; i++){
if(!DFS(g,visit,i)){
return false;
}
}
return true;
}
private:
bool DFS(vector<vector<int>> &g ,vector<int> &visit ,int i ){
if(visit[i] == -1) return false;
if(visit[i] == 1) return true;
visit[i] = -1 ;
for(auto a : g[i]){
if(!DFS(g,visit,a)) return false;
}
visit[i] = 1 ;
return true ;
}
};