美文网首页
Java 算法-拓扑排序(深搜或者广搜)

Java 算法-拓扑排序(深搜或者广搜)

作者: 琼珶和予 | 来源:发表于2018-01-11 10:06 被阅读0次

  说实话,在数据结构中,拓扑排序我掌握的不是很好,今天在lintCode上面做了关于拓扑排序的题,才开始还是有点懵逼,后面的渐渐的分析,还是做出来了。在这里只是做一个记录,随便巩固一下深搜和广搜。

题意:
给定一个有向图,图节点的拓扑排序被定义为:

对于每条有向边A--> B,则A必须排在B之前  
拓扑排序的第一个节点可以是任何在图中没有其他节点指向它的节点  
找到给定图的任一拓扑排序
注意事项:
你可以假设图中至少存在一种拓扑排序

  由于lintCode上面的图片不能显示出来,所以样例就看不到,这里就不再贴出样例,各位大佬可以yy。

1.广搜算法

  由于拓扑排序是数据结构中比较重要的部分,大家都知道,这里就不再讲解它的解题思路

//需要注意的是,这里的图使用领接表来保存
     public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {
        ArrayList<DirectedGraphNode> list = new ArrayList<>();
        if (graph == null || graph.size() == 0) {
            return list;
        }
        //遍历领接表,用map来保存每个点的入度是多少
        Map<DirectedGraphNode, Integer> map = new HashMap<>();
        for (DirectedGraphNode n : graph) {
            if(!map.containsKey(n)) {
                map.put(n, 0);
            }
            for (DirectedGraphNode n1 : n.neighbors) {
                if (!map.containsKey(n1)) {
                    map.put(n1, 1);
                } else {
                    int i = map.get(n1) + 1;
                    map.remove(n1);
                    map.put(n1, i);
                }
            }
        }
        Queue<DirectedGraphNode> queue = new LinkedList<>();
        Set<DirectedGraphNode> set = map.keySet();
        for (DirectedGraphNode key : set) {
            if (map.get(key) == 0) {
                queue.offer(key);
            }
        }
        //广搜
        while (!queue.isEmpty()) {
            DirectedGraphNode node = queue.poll();
            list.add(node);
            for (DirectedGraphNode n : node.neighbors) {
                int i = map.get(n) - 1;
                map.remove(n);
                if (i >= 0) {
                    map.put(n, i);
                }
                if (i == 0) {
                    queue.offer(n);
                }
            }
        }
        return list;
    }

2.深搜算法

private ArrayList<DirectedGraphNode> list = new ArrayList<>();
    public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {
        
        if (graph == null || graph.size() == 0) {
            return list;
        }
        Map<DirectedGraphNode, Integer> map = new HashMap<>();
        for (DirectedGraphNode n : graph) {
            if (!map.containsKey(n)) {
                map.put(n, 0);
            }
            for (DirectedGraphNode n1 : n.neighbors) {
                if (!map.containsKey(n1)) {
                    map.put(n1, 1);
                } else {
                    int i = map.get(n1) + 1;
                    map.remove(n1);
                    map.put(n1, i);
                }
            }
        }
        Set<DirectedGraphNode> set = map.keySet();
        for (DirectedGraphNode key : set) {
            //一旦它的入度为0,那么搜索它
            if (map.get(key) == 0) {
                list.add(key);
                dfs(key, map);
                break;
            }
        }
        return list;
    }

    public void dfs(DirectedGraphNode node, Map<DirectedGraphNode, Integer> map) {
        for (DirectedGraphNode n : node.neighbors) {
            int i = map.get(n) - 1;
            map.replace(n, i);
            if(i == 0) {
                //记得这里将入度为0的节点置为-1,因为上面的遍历入度为0的node是,可能会重复搜索
                map.replace(n, -1);
                list.add(n);
                dfs(n, map);
            }
        }
    }

相关文章

  • Java 算法-拓扑排序(深搜或者广搜)

      说实话,在数据结构中,拓扑排序我掌握的不是很好,今天在lintCode上面做了关于拓扑排序的题,才开始还是有点...

  • Java 算法-图中两个点之间的路线(深搜或者广搜)

      说实话,这道题把我坑惨了!我以为就是简单的从头开始深搜到尾,但是错了!害得我一直超时! 题意: 样例: 1.深...

  • 搜索算法

    搜索一般指的是深度搜索和广度搜索。这两种搜索算法都有固定的格式,下面是深搜和广搜的固定套路: 1.广搜(BFS) ...

  • 简单的搜索 ----(dfs) 和 (bfs)简单的

    广搜(bfs)和 深搜(dfs) 先从广搜说起(bfs)广搜,字面感觉就是广面的搜索,其实就是这样的,我认为可以把...

  • 16-图的深搜和广搜二

    图的深搜和广搜 前面一篇是利用深搜和广搜进行图的顶点的遍历,今天我们则是根据起点和终点位置进行路径的搜索。 图的深...

  • DFS(深搜)算法

    深度优先搜索算法(Depth-First-Search):是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的...

  • 数据结构

    1.判断一个有向图是否有环? 深度优先搜遍历 拓扑排序

  • 7.6图的应用:拓扑排序

    拓扑排序Topological Sort ❖从工作流程图得到工作次序排列的算法,称为“拓扑排序”❖拓扑排序处理一个...

  • 模板

    并查集 拓扑排序 Floyd算法 Dijkstra算法

  • 47. 全排列 II

    思路 排序,人为规定顺序去重。 深搜+回溯

网友评论

      本文标题:Java 算法-拓扑排序(深搜或者广搜)

      本文链接:https://www.haomeiwen.com/subject/cglznxtx.html