Topological Sorting

原创 2016年05月31日 19:33:37

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

参考点击打开链接

用的是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;
    }



相关文章推荐

拓扑排序Topological Sorting

http://blog.csdn.net/pipisorry/article/details/71125207拓扑排序Topological Sorting在图论中,拓扑排序(Topological ...

拓扑排序(Topological Sorting)

一、什么是拓扑排序在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条...

BC DZY Loves Topological Sorting

DZY Loves Topological Sorting    Accepts: 112    Submissions: 586  Time Limit: 4000/2000 MS (Java/O...

拓扑排序(Topological Sorting)算法

拓扑排序(Topological Sorting)在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序: 每个顶点出现且只出现一次; 若A在序列中排在B的前面,则...

DZY Loves Topological Sorting (BC #35 hdu 5195 topsort+优先队列)

题意:n个点m条有向边组成的有向无环图,可以最多删除k条边让他的拓扑序最大。输出最大的拓扑序。 思路:在以前的topsort中是入读为零的点入队列,这里有k次机会可以删除边,那么我就把所有入度...

【Best Coder】#35 DZY Loves Topological Sorting(线段树维护)

题目思路:题目要求点数最大的优先输出。由于可以将k条边去掉。 所以这边的一个基本思想就是。面对这次的输出。我们应该选择一个点数最大的,并且他的入度 并且注意是每次。每次都得重新选择。 下面这组数...

hdu 5195 DZY Loves Topological Sorting【拓扑排序+优先队列+邻接表】

DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072...

Hdoj 5195 DZY Loves Topological Sorting 【拓扑】+【线段树】

DZY Loves Topological SortingTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K...

拓扑排序(topological sorting)

AOV网络  在有向图中,用顶点表示活动,用有向边表示活动Vi必须先于活动Vj进行。这种有向图叫作顶底表示活动的网络(Active on vertices),记作AOV网络。   在AOV网络中,如...

HDU 5195 DZY Loves Topological Sorting (拓扑排序+线段树)

题目地址:HDU 5195 简直受不了了。。BC第二题都开始线段树+拓扑排序了。。。 这题很容易想到拓扑排序过程中贪心,但是贪心容易TLE,所以需要用数据结构去维护,我用的是线段树维护。每次找入度...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Topological Sorting
举报原因:
原因补充:

(最多只允许输入30个字)