packagecom.thealgorithms.datastructures.graphs;importjava.util.ArrayList;importjava.util.Map;importjava.util.LinkedHashMap;importjava.util.HashMap;importjava.util.Set;importjava.util.Queue;importjava.util.LinkedList;/**
* An algorithm that sorts a graph in toplogical order.
*//**
* A class that represents the adjaceny list of a graph
*/classAdjacencyList<EextendsComparable<E>>{Map<E,ArrayList<E>> adj;AdjacencyList(){
adj =newLinkedHashMap<E,ArrayList<E>>();}/**
* This function adds an Edge to the adjaceny list
*
* @param from , the vertex the edge is from
* @param to, the vertex the edge is going to
*/voidaddEdge(E from,Eto){try{
adj.get(from).add(to);}catch(ExceptionE){
adj.put(from,newArrayList<E>());
adj.get(from).add(to);}if(!adj.containsKey(to)){
adj.put(to,newArrayList<E>());}}/**
* @param v, A vertex in a graph
* @return returns an ArrayList of all the adjacents of vertex v
*/ArrayList<E>getAdjacents(E v){return adj.get(v);}/**
* @return returns a set of all vertices in the graph
*/Set<E>getVertices(){return adj.keySet();}/**
* Prints the adjacency list
*/voidprintGraph(){for(E vertex : adj.keySet()){System.out.print(vertex +" : ");for(E adjacent : adj.get(vertex)){System.out.print(adjacent +" ");}System.out.println();}}}classTopologicalSort<EextendsComparable<E>>{AdjacencyList<E> graph;Map<E,Integer> inDegree;TopologicalSort(AdjacencyList<E> graph){this.graph = graph;}/**
* Calculates the in degree of all vertices
*/voidcalculateInDegree(){
inDegree =newHashMap<>();for(E vertex : graph.getVertices()){if(!inDegree.containsKey(vertex)){
inDegree.put(vertex,0);}for(E adjacent : graph.getAdjacents(vertex)){try{
inDegree.put(adjacent, inDegree.get(adjacent)+1);}catch(Exception e){
inDegree.put(adjacent,1);}}}}/**
* Returns an ArrayList with vertices arranged in topological order
*/ArrayList<E>topSortOrder(){calculateInDegree();Queue<E> q =newLinkedList<E>();for(E vertex : inDegree.keySet()){if(inDegree.get(vertex)==0){
q.add(vertex);}}ArrayList<E> answer =newArrayList<>();while(!q.isEmpty()){E current = q.poll();
answer.add(current);for(E adjacent : graph.getAdjacents(current)){
inDegree.put(adjacent, inDegree.get(adjacent)-1);if(inDegree.get(adjacent)==0){
q.add(adjacent);}}}return answer;}}/**
* A driver class that sorts a given graph in topological order.
*/publicclassKahnsAlgorithm{publicstaticvoidmain(String[] args){//Graph definition and initializationAdjacencyList<String> graph =newAdjacencyList<>();
graph.addEdge("a","b");
graph.addEdge("c","a");
graph.addEdge("a","d");
graph.addEdge("b","d");
graph.addEdge("c","u");
graph.addEdge("u","b");TopologicalSort<String> topSort =newTopologicalSort<>(graph);//Printing the orderfor(String s : topSort.topSortOrder()){System.out.print(s +" ");}}}