class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> graph(numCourses);
vector<int> indegree(numCourses);
vector<int> result;
queue<int> que;
for(auto& pre : prerequisites) {
graph[pre[1]].push_back(pre[0]);
indegree[pre[0]]++;
}
for(int i = 0; i < numCourses; i++) {
if(indegree[i] == 0) que.push(i);
}
if(que.empty() == true) return {};
int nodeVisited = 0;
while(que.empty() == false) {
int current = que.front();
que.pop();
nodeVisited++;
result.push_back(current);
for(auto& edge : graph[current]) {
indegree[edge]--;
if(indegree[edge] == 0) que.push(edge);
}
}
if(nodeVisited != numCourses) return {};
return result;
}
};