1. class Solution {
  2.  
  3. public ArrayList<Integer> topoSort(int V, int[][] edges) {
  4. ArrayList<Integer> res = new ArrayList<>();
  5. ArrayList<ArrayList<Integer>> adj = new ArrayList<>();
  6.  
  7. for(int i=0; i<V; i++)
  8. {
  9. adj.add(new ArrayList<Integer>());
  10. }
  11.  
  12. for(int[] edge : edges)
  13. {
  14. int u = edge[0];
  15. int v = edge[1];
  16.  
  17. adj.get(u).add(v);
  18. }
  19.  
  20. // Step-1 Create an indegree array
  21. int[] indegree = new int[V];
  22. for(int i=0; i<V; i++)
  23. {
  24. // if neighbour is present then increment the indegree as there is incoming edge towards it
  25. for(int u : adj.get(i))
  26. {
  27. indegree[u]++;
  28. }
  29. }
  30.  
  31. // Step-2 Check nodes whose indegree is 0, add those nodes to Queue
  32. Queue<Integer> q = new LinkedList<>();
  33. for(int i=0; i<indegree.length; i++)
  34. {
  35. if(indegree[i] == 0)
  36. q.add(i);
  37. }
  38.  
  39. // Step-3 Traverse all nodes until queue becomes empty
  40. while(!q.isEmpty())
  41. {
  42. int node = q.poll();
  43. res.add(node);
  44.  
  45. // traverse through neighbour nodes and update the indegree
  46. for(int u : adj.get(node))
  47. {
  48. indegree[u]--;
  49. if(indegree[u] == 0)
  50. q.add(u);
  51. }
  52. }
  53. return res;
  54. }
  55. }