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)算法

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

Topological Sorting(拓扑排序)

程序来源:Topological Sorting。 C++程序如下: // A C++ program to print topological sorting of a DAG #include...
  • tigerisland45
  • tigerisland45
  • 2017年02月28日 00:32
  • 471

拓扑排序(Topological Sort)

0)拓扑排序 拓扑排序是对有向无圈图的顶点的一种排序,这个排序的结果是如果存在一条vi到vj的路径,那么排序中vi在vj的前面。 下图是一个有向无圈图的例子: 在这个有向无圈图中,1,6...
  • changyuanchn
  • changyuanchn
  • 2013年12月02日 11:05
  • 9535

拓扑排序(topological sorting)

AOV网络  在有向图中,用顶点表示活动,用有向边表示活动Vi必须先于活动Vj进行。这种有向图叫作顶底表示活动的网络(Active on vertices),记作AOV网络。   在AOV网络中,如...
  • yongyuandeie
  • yongyuandeie
  • 2015年06月08日 16:55
  • 824

Topological sorting

algorithm Kahn algorithm L ← Empty list that will contain the sorted elements S ← Set of all nod...
  • dyllanzhou
  • dyllanzhou
  • 2015年09月06日 13:00
  • 234

Topological Sorting

Given an directed graph, a topological order of the graph nodes is defined as follow:For each direct...
  • zjj2015
  • zjj2015
  • 2016年01月23日 12:49
  • 72

Topological Sorting in a DAG

给定有向无环图(DAG),以拓扑顺序打印。如果DAG有多个拓扑排序,请打印其中任何一个。有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点u到顶点v的每个有向边uv,u在排序中到达v。如果且...
  • qq_27631087
  • qq_27631087
  • 2017年07月21日 12:53
  • 46

Topological Sorting的总结

原题地址:http://www.lintcode.com/zh-cn/problem/topological-sorting/ 一.目的:给定一个有向图,对其进行点排序,即对于任何连接自顶点u到顶点...
  • u012255731
  • u012255731
  • 2016年10月13日 20:58
  • 109

Topological Sorting(拓扑排序必考题)

http://www.lintcode.com/en/problem/topological-sorting/ 题目:将图中节点进行拓扑排序(假设图中至少存在一个拓扑序列)          cl...
  • joycetlm
  • joycetlm
  • 2017年08月10日 09:25
  • 372

timus 1280 Topological Sorting

该题大意就是给出几条有向边和相应点的排序,判断这样的点是否合理。 开始时用了hash数组记录有向边,发现出错,后来知道了需要判重,开始真的难到了。可仔细观察map数组,主意就来了,程序如下: #i...
  • quanqiuzhongzi
  • quanqiuzhongzi
  • 2013年06月28日 18:09
  • 733
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Topological Sorting
举报原因:
原因补充:

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