Topological Sorting

来源:互联网 发布:柳州阿佳希软件 编辑:程序博客网 时间:2024/06/06 14:15

图的拓扑排序,这也是给自己补上一课。

参考点击打开链接

用的是bfs来处理的。

有三个循环,

第一个是将所有有父节点的节点放进map中,并对每一个节点保存其父节点的个数;

第二个将将没有父节点的节点放进results和queue中,这些节点就是根节点,即拓扑的开端,

第三个依次将每个有父节点的节点中保存的父节点个数不断减1,清0,注意自己清0的错误

这个过程能保证顺序的

/**     * @param graph: A list of Directed graph node     * @return: Any topological order for the given graph.     */        public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {        // write your code here        ArrayList<DirectedGraphNode> results = new ArrayList<>();        if (graph == null) {            return results;        }        Map<DirectedGraphNode, Integer> map = new HashMap<>();        for (DirectedGraphNode node: graph) {            for (DirectedGraphNode neighborNode: node.neighbors) {                if (map.containsKey(neighborNode)) {                    map.put(neighborNode, map.get(neighborNode) + 1);                } else {                    map.put(neighborNode, 1);                }            }        }                Queue<DirectedGraphNode> queue = new LinkedList<>();        for (DirectedGraphNode node: graph) {            if (!map.containsKey(node)) {                queue.offer(node);                results.add(node);            }        }                while (!queue.isEmpty()) {            DirectedGraphNode node = queue.poll();            for (DirectedGraphNode neighborNode: node.neighbors) {                map.put(neighborNode, map.get(neighborNode) - 1);                if (map.get(neighborNode) == 0) {                    queue.offer(neighborNode);                    results.add(neighborNode);                }                // int num = map.get(neighborNode);                // if (num != 0) {                //     map.put(neighborNode, num - 1);                // } else {                //     queue.offer(neighborNode);                //     results.add(neighborNode);                // }            }        }        return results;    }



0 0
原创粉丝点击