class Solution {
public:
vector<int> res;
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
if(numCourses==0) return {};
vector<vector<int>> tmp(numCourses);
//flag:2表示从该节点起无环,1表示正在遍历,0表示还未遍历过
vector<int> flag(numCourses);
//tmp[i]里包含所有i指向的节点
for(int i=0;i<prerequisites.size();++i){
tmp[prerequisites[i][0]].push_back(prerequisites[i][1]);
}
bool ans = true;
for(int i=0;i<numCourses;++i){
ans = ans&&dfs(i,flag,tmp);
}
if(ans){
for(int i=0;i<flag.size();++i){
if(!flag[i]){
res.push_back(i);
}
}
return res;
}
return {};
}
bool dfs(int i, vector<int> &flag, const vector<vector<int>> &tmp){
if(flag[i]==2)//之前已检验过,从该点起无环,直接返回
return true;
else if(flag[i]==1)//是正在检验的点,说明有环
return false;
flag[i] = 1;//表示正在检验
for(int j=0;j<tmp[i].size();++j){
if(dfs(tmp[i][j],flag,tmp)){
continue;
}
return false;
}
res.push_back(i);
flag[i] = 2;
return true;
}
};
210. 课程表 II/C++
最新推荐文章于 2022-11-15 10:21:18 发布