
class Solution {
public:
vector<int> res;
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
if(numCourses==0) return {};
vector<vector<int>> tmp(numCourses);
vector<int> flag(numCourses);
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;
}
};