(1)dfs+stack
class Solution {
private:
vector<vector<int>> vec;
vector<int> vis;
stack<int> s;
vector<int> res;
bool tag=true;
public:
void helper(int x) {
vis[x]=1;
for(int i=0;i<vec[x].size();i++) {
if(vis[vec[x][i]]==0) {
helper(vec[x][i]);
if(!tag) return;
} else if(vis[vec[x][i]]==1) {
tag=false;
return;
}
}
vis[x]=2;
s.push(x);
return;
}
vector<int> findOrder(int n, vector<vector<int>>& p) {
vec.resize(n);
vis.resize(n);
for(int i=0;i<p.size();i++) {
vec[p[i][1]].push_back(p[i][0]);
}
for(int i=0;i<n&&tag;i++) {
if(vis[i]==0&&tag) helper(i);
}
if(!tag) return {};
while(!s.empty()) {
res.push_back(s.top());
s.pop();
}
return res;
}
};