有向图的深度优先搜索,检测是否有环,需要一个数组记录相邻节点,如果深度优先搜索遍历到了已经遍历过的节点,则证明有环。
class Solution {
public:
vector<vector<int>> graph;
vector<int> course;
vector<int> res;
vector<int> recordCourse;
bool valid = true;
void dfs(int currentCourse){
if(recordCourse[currentCourse] == 1) {
valid = false;
return;
};
recordCourse[currentCourse] = 1;
for(auto edge : graph[currentCourse]){
if(recordCourse[edge] == 0){
dfs(edge);
if(valid == false) return;
}else if(recordCourse[edge] == 1){
valid = false;
return;
}
}
course.push_back(currentCourse);
recordCourse[currentCourse] = 2;
}
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
int n = prerequisites.size();
recordCourse.resize(numCourses, 0);
graph.resize(numCourses);
if(n == 0){
for(int i = 0; i < numCourses; ++i){
course.push_back(i);
}
return course;
}
for(int i = 0; i < n; ++i){
graph[prerequisites[i][0]].push_back(prerequisites[i][1]);
}
for(int i = 0; i < numCourses; ++i){
if(recordCourse[i] == 0){
dfs(i);
if(valid == false) return {};
}
}
return course;
}
};