package com.interview.algorithms.graph; import com.interview.basics.model.graph.generic.weighted.Edge; import com.interview.basics.model.graph.generic.weighted.Graph; import com.interview.basics.model.graph.generic.weighted.Vertex; import java.util.*; /** * Created_By: zouzhile * Date: 4/20/14 * Time: 8:04 PM */ public class C6_6_TopologicalSorting { public List<String> topologicalSort(Graph<String> graph) { List<String> result = new ArrayList<String>(); HashMap<String, List<Edge>> edges = graph.getAllEdges(); HashMap<String, Integer> inDegrees = new HashMap<String, Integer>(); // O(V) List<String> startingVertexes = new ArrayList<String>(); Iterator<Vertex<String>> vertexes = graph.vertexes(); while(vertexes.hasNext()) startingVertexes.add(vertexes.next().getValue()); // O(E) for(Map.Entry<String, List<Edge>> vertexEdgesEntry : edges.entrySet()) { List<Edge> vertexEdges = vertexEdgesEntry.getValue(); Iterator<Edge> edgeIterator = vertexEdges.iterator(); while(edgeIterator.hasNext()) { Edge edge = edgeIterator.next(); Vertex<String> target = edge.getTarget(); String targetVertexName = target.getValue(); startingVertexes.remove(targetVertexName); Integer degrees = inDegrees.get(targetVertexName); if(degrees == null) degrees = 0; inDegrees.put(targetVertexName, degrees + 1); } } // O(V+E) while(! startingVertexes.isEmpty()) { Iterator<String> startingVertexesItr = startingVertexes.iterator(); List<String> toRemove = new ArrayList<String>(); List<String> toAdd = new ArrayList<String>(); while(startingVertexesItr.hasNext()) { String startingVertex = startingVertexesItr.next(); toRemove.add(startingVertex); result.add(startingVertex); List<Edge> outEdges = edges.get(startingVertex); if(outEdges != null) for(Edge edge : outEdges) { String target = (String)edge.getTarget().getValue(); Integer newDegree = inDegrees.get(target) - 1; inDegrees.put(target, newDegree); if(newDegree == 0) { toAdd.add(target); inDegrees.remove(target); } } } startingVertexes.removeAll(toRemove); startingVertexes.addAll(toAdd); } return result; } }