class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
int N = numCourses;
vector<vector<int>> edge(N,vector<int>());
unordered_map<int,int> mp;
for(int i=0;i<prerequisites.size();i++){
int b = prerequisites[i][0];
int a = prerequisites[i][1];
edge[a].push_back(b);
mp[b]++;
}
queue<int> q;
for(int i=0;i<N;i++) if(mp[i] == 0) q.push(i);
vector<int> ans(N,0);
int cnt = 0;
while(!q.empty()){
int now = q.front();
q.pop();
ans[cnt++] = now;
for(int i=0;i<edge[now].size();i++){
int next = edge[now][i];
if(mp[next] == 0) continue; // 已经访问过
mp[next] -- ;
if(mp[next] == 0) q.push(next);
}
}
if(cnt != N) return vector<int>();
return ans;
}
};