//https://leetcode.cn/problems/course-schedule-ii/
const int N=2e3+10,M=N*(N-1);
class Solution {
private:
int n,m;
int head[N],Next[M],to[M],cnt;
int indegree[N];
int h,t;
int q[N];
vector<int> ans;
void build(){
cnt=1;
h=t=0;
memset(head,0,sizeof head);
memset(indegree,0,sizeof indegree);
}
void addEdge(int u,int v){
Next[cnt]=head[u];
to[cnt]=v;
head[u]=cnt++;
}
bool topoSort(){
for(int i=0;i<n;i++) if(indegree[i]==0) q[t++]=i;
int fill=0;
while(h<t){
int u=q[h++];
ans.push_back(u);
fill++;
for(int ei=head[u],v;ei;ei=Next[ei]){
v=to[ei];
if(--indegree[v]==0) q[t++]=v;
}
}
return fill==n;
}
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
n=numCourses,m=prerequisites.size();
build();
for(int i=0,u,v;i<m;i++){
indegree[prerequisites[i][0]]++;
addEdge(prerequisites[i][1],prerequisites[i][0]);
}
if(!topoSort()) ans.clear();
return ans;
}
};