zoukankan      html  css  js  c++  java
  • 拓扑排序

    一、定义

    拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列

    这样说,可能理解起来比较抽象。下面通过简单的例子进行说明!
    例如,一个项目包括A、B、C、D四个子部分来完成,并且A依赖于B和D,C依赖于D。现在要制定一个计划,写出A、B、C、D的执行顺序。这时,就可以利用到拓扑排序,它就是用来确定事物发生的顺序的。

    在拓扑排序中,如果存在一条从顶点A到顶点B的路径,那么在排序结果中B出现在A的后面。

    二、算法思想

    记录每个节点的入度和出度,入度为0 的节点为拓扑序列头部。

    从上一节点得到下一节,从中选择入度最小的节点加入拓扑序列。

    当得到加入拓扑序列的节点出度为0时,排序结束。

    如果序列中的节点数少于总节点数,说明该图不是DAG,无法进行拓扑排序。

    例:

    这是一个简单的DAG


    拓扑排序步骤如下:
    (1)定义一个队列Q,并把所有入度为0的结点加入队列
    (2)取队首结点,访问输出,然后删除所有从它出发的边,并令这些边到达的顶点的入度减1,如果某个顶点的入度减为0,则将其加入队列。
    (3)重复进行(2)操作,直到队列为空。如果队列为空时入过队的结点数恰好为N,说明拓扑排序成功,图G为有向无环图;否则,拓扑排序失败,图G有环。

    结点0和1的入度都为0,可以任意访问,但是结点2必须在结点0和1访问完之后才能访问,同理结点3和4必须在结点2访问完以后才能访问,但是结点3和4 之间没有依赖关系,结点5必须在结点3和结点6访问之后才能访问,等等.....
    因此,对于上图的一个拓扑序列可以是:0,1,2,3,4,6,5,7 也可以是:0,1,2,4,6,3,5,7

    拓扑排序两种做法:

    ​ 1、采用朴素做法,使用二维数组存储有向图

    ​ 2、使用邻接表存储有向图

    ACwing848有向图的拓扑序列>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>AC代码

    HDU1285确定比赛名次>>>>>>>>>>>>>AC代码1>>>>>>>>>>>>>>AC代码2

  • 相关阅读:
    Java NIO3:缓冲区Buffer
    Java NIO2:NIO概述
    Mybatis学习总结(六)——高级映射(一对一,一对多,多对多)
    Java NIO1:浅谈I/O模型
    Java多线程(三)—— synchronized关键字详解
    Java IO(五)——字符流进阶及BufferedWriter、BufferedReader
    Java IO(四)——字符流
    mysql 实现树形的遍历
    Java IO(三)——字节流
    使用 SVN Hook 实现服务器端代码自动更新
  • 原文地址:https://www.cnblogs.com/trirabbits/p/11733195.html
Copyright © 2011-2022 走看看