class Solution {
public:
// 记录递归堆栈的结点
vector<bool> onpath;
vector<bool> visited;
// 记录是否成环
bool hasCircle = false;
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
auto graph=buildGraph(numCourses,prerequisites);
//设置大小为numCourse的数组
onpath=vector<bool>(numCourses);
visited=vector<bool>(numCourses);
for(int i=0;i<numCourses;i++){
//遍历图中所有节点
traverse(graph,i);
}
//只要没有循环依赖就可以完成所有课程
return !hasCircle;
}
void traverse(vector<vector<int>>& graph,int s){
if(hasCircle){
//说明已经成环
return ;
}
if(onpath[s]){
hasCircle=true;
return ;
}
if(visited[s]){
return;
}
//记录已经访问过结点s
onpath[s]=true;
//将已经访问过过的结点s标记
visited[s]=true;
for(int t:graph[s]){
traverse(graph,t);
}
onpath[s]=false;
}
vector<vector<int>>buildGraph(int numCourses, vector<vector<int>>& prerequisites){
//图中共有numCourses
vector<vector<int>>graph(numCourses);
for(int i=0;i<numCourses;i++){
graph[i]=vector<int>();
}
for(auto& edge:prerequisites){
int from=edge[1],to=edge[0];
graph[from].push_back(to);
}
return graph;
}
};