package com.interview.books.question300; import com.interview.leetcode.utils.GraphNode; import java.util.*; /** * Created_By: stefanie * Date: 14-12-16 * Time: 下午3:04 */ public class TQ33_DAGTopologySorter { public List<GraphNode> sort(List<GraphNode> nodes){ List<GraphNode> sorted = new ArrayList<GraphNode>(); HashMap<GraphNode, Integer> indegree = new HashMap<>(); for(GraphNode node : nodes){ for(GraphNode neighbor : node.neighbors){ if(indegree.containsKey(neighbor)) indegree.put(neighbor, indegree.get(neighbor) + 1); else indegree.put(neighbor, 1); } } //put 0-in-degree node in queue Queue<GraphNode> queue = new LinkedList(); for(GraphNode node : nodes){ if(!indegree.containsKey(node)) { queue.offer(node); } } while(!queue.isEmpty()){ GraphNode node = queue.poll(); sorted.add(node); for(GraphNode neighbor : node.neighbors){ indegree.put(neighbor, indegree.get(neighbor) - 1); if(indegree.get(neighbor) == 0) queue.offer(neighbor); } } return sorted; } public static void main(String[] args){ TQ33_DAGTopologySorter sorter = new TQ33_DAGTopologySorter(); List<GraphNode> nodes = new ArrayList<>(); for(int i = 0; i < 6; i++){ nodes.add(new GraphNode(i)); } nodes.get(1).neighbors.add(nodes.get(2)); nodes.get(1).neighbors.add(nodes.get(4)); nodes.get(2).neighbors.add(nodes.get(3)); nodes.get(2).neighbors.add(nodes.get(5)); nodes.get(3).neighbors.add(nodes.get(4)); List<GraphNode> sorted = sorter.sort(nodes); for(int i = 0; i < sorted.size(); i++){ System.out.print(sorted.get(i).label + ", "); } //0, 1, 2, 3, 5, 4, } }