拓扑排序

来源:互联网 发布:log4j.xml 输出sql 编辑:程序博客网 时间:2024/06/07 01:41

本总结是是个人为防止遗忘而作,不得转载和商用。

什么是拓扑排序

         对一个有向无环图(DirectedAcyclic Graph,DAG)G进行拓扑排序,是将G中所有顶点排

成线性序列,使得图中任意一对顶点u、v,若u和v之间存在边,则在线性序列中u出现在v之前。

         PS:u只要在v之前就好,不一定要相邻。

         如对于下图来说

                  

         一种可能的拓扑排序结果就是:

                  2 → 8 → 0 → 3 → 7 → 1 → 5 → 6 → 9 → 4 → 11 → 10 → 12

拓扑排序的方法

         1,计算每个节点的“入度”(指向它的节点数量)

         2,输出入度=0的节点,并将指向该节点的节点的入度-1

         3,重复第二步,直到所有节点的入度=0(即:所有节点都排序好了)

         PS:当没有节点的入度为0时说明存在环,而这里的前提是无环图,所以这种情况不存在。

 

一些补充

         1,拓扑排序的本质是不断输出入度为0的点,该算法可用于判断图中是否存在环;

         2,可以用队列(或者栈)保存入度为0的点,避免每次遍历所有点。这只需要每次更新连接点的入度即可。

         3,拓扑排序其实是给定了结点的一组偏序关系。

0 0