package DataStructures.Graphs;import java.util.ArrayList;import java.util.Map;import java.util.LinkedHashMap;import java.util.HashMap;import java.util.Set;import java.util.Queue;import java.util.LinkedList;/*** An algorithm that sorts a graph in toplogical order.*//*** A class that represents the adjaceny list of a graph*/class AdjacencyList<E extends Comparable<E>>{Map<E,ArrayList<E>> adj;AdjacencyList(){adj = new LinkedHashMap<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*/void addEdge(E from, E to){try{adj.get(from).add(to);}catch(Exception E){adj.put(from,new ArrayList<E>());adj.get(from).add(to);}if(!adj.containsKey(to)){adj.put(to, new ArrayList<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*/void printGraph(){for(E vertex: adj.keySet()){System.out.print(vertex+" : ");for(E adjacent: adj.get(vertex)){System.out.print(adjacent+" ");}System.out.println();}}}class TopologicalSort<E extends Comparable<E>>{AdjacencyList<E> graph;Map<E,Integer> inDegree;TopologicalSort(AdjacencyList<E> graph){this.graph = graph;}/*** Calculates the in degree of all vertices*/void calculateInDegree(){inDegree = new HashMap<>();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 = new LinkedList<E>();for(E vertex: inDegree.keySet()){if(inDegree.get(vertex) == 0){q.add(vertex);}}ArrayList<E> answer = new ArrayList<>();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.*/public class KahnsAlgorithm{public static void main(String[] args){//Graph definition and initializationAdjacencyList<String> graph = new AdjacencyList<>();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 = new TopologicalSort<>(graph);//Printing the orderfor(String s: topSort.topSortOrder()){System.out.print(s+" ");}}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。