class Solution {
public ArrayList<Integer> topoSort(int V, int[][] edges) {
ArrayList<Integer> res = new ArrayList<>();
ArrayList<ArrayList<Integer>> adj = new ArrayList<>();
for(int i=0; i<V; i++)
{
adj.add(new ArrayList<Integer>());
}
for(int[] edge : edges)
{
int u = edge[0];
int v = edge[1];
adj.get(u).add(v);
}
// Step-1 Create an indegree array
int[] indegree = new int[V];
for(int i=0; i<V; i++)
{
// if neighbour is present then increment the indegree as there is incoming edge towards it
for(int u : adj.get(i))
{
indegree[u]++;
}
}
// Step-2 Check nodes whose indegree is 0, add those nodes to Queue
Queue<Integer> q = new LinkedList<>();
for(int i=0; i<indegree.length; i++)
{
if(indegree[i] == 0)
q.add(i);
}
// Step-3 Traverse all nodes until queue becomes empty
while(!q.isEmpty())
{
int node = q.poll();
res.add(node);
// traverse through neighbour nodes and update the indegree
for(int u : adj.get(node))
{
indegree[u]--;
if(indegree[u] == 0)
q.add(u);
}
}
return res;
}
}