思路: 1、用字典存储每个节点的入度 2、用队列存储入度为零的节点 3、BFS
static public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) { // write your code here //返回的值 ArrayList<DirectedGraphNode> ret=new ArrayList<>(); //队列 Queue<DirectedGraphNode> que=new LinkedList<>(); //字典 HashMap<DirectedGraphNode, Integer> dict=new HashMap<>(); //入度的计算 for(DirectedGraphNode k : graph) { if(!dict.containsKey(k)) { dict.put(k, 0); for(DirectedGraphNode m:k.neighbors) { if(!dict.containsKey(m)) dict.put(m, 1); else { dict.put(m, dict.get(m)+1); } } } else { for(DirectedGraphNode m:k.neighbors) { if(!dict.containsKey(m)) dict.put(m, 1); else { dict.put(m, dict.get(m)+1); } } } } //将所有最开始入度就为零的节点放到队列里 for(DirectedGraphNode n:dict.keySet()) { if(dict.get(n).equals(0)) { que.add(n); } } //进行主要的循环部分,实现输出 while(!que.isEmpty()) { DirectedGraphNode temp=que.poll();//将队列取出一个 ret.add(temp);//输出:放到ret返回值里 //将输出节点的下一个节点入度减一 for(DirectedGraphNode m : temp.neighbors) { dict.put(m,dict.get(m)-1); if(dict.get(m)==0)//如果减一后入度为0 que.add(m);//就放到队列中 } } //最终返回 return ret; }新闻热点
疑难解答