图--拓扑排序

    图的其他知识

    拓扑排序是对有向无环图(DAG)应用AOV网来进行的图排序,排序生成的线性序列具有前后制约关系

AOV网

    用一个有向图表示一个工程的各子工程及其相互制约关系,该图中的顶点表示活动,弧表示制约关系

特点

    排序后的序列不唯一

    不存在回路

    若从i到j有路径,则i是j的前驱,j是i的后继

    若存在边,则i是j的直接前驱,j是i的直接后继

    一定存在一个入度为0的顶点和一个出度为0的顶点

回路的判断

    生成的线性序列的元素个数与图的顶点数相等,因为拓扑排序每次挑选的都是无前驱的点,这势必导致最后存在回路的被剩余

实现方式

    每次从图中挑选一个无前驱的顶点,同时删除该顶点发出的弧,直到顶点被挑选完

图解

        挑选无前驱的顶点1,此时序列为1

        挑选无前驱的顶点7,此时序列为1,7

        挑选无前驱的顶点2,此时序列为1,7,2

        挑选无前驱的顶点12,此时序列为1,7,2,12

        挑选无前驱的顶点10,此时序列为1,7,2,12,10

        挑选无前驱的顶点6,此时序列为1,7,2,12,10,6

        挑选无前驱的顶点3,此时序列为1,7,2,12,10,6,3

        挑选无前驱的顶点5,此时序列为1,7,2,12,10,6,3,5

        挑选无前驱的顶点9,此时序列为1,7,2,12,10,6,3,5,9

        挑选无前驱的顶点11,此时序列为1,7,2,12,10,6,3,5,9,11

        挑选无前驱的顶点4,此时序列为1,7,2,12,10,6,3,5,9,11,4

        此时,其中一个拓扑排序序列为1,7,2,12,10,6,3,5,9,11,4,8

Javascript代码实现

    使用十字链表存储图  

        1-节点结构

(  顶点结构 )
( 边表节点结构 )

        2-初始化顶点表和边数组

        3-创建边表

( 对于1-6来说,1的出度是6,6的入度为1,即节点6指针指向1,当匹配到7-6时,vexs[endI]即节点6的指针指向7同时将节点7指向节点1,从而构成边表)

    初始化

        1-使用单for循环查找出第一层入度为0的顶点

            查找的顶点为1和7

        2-通过动态减少顶点中记录的入度数作伪删除

            假设当前次为1,则取到节点1的出度表,从而找到节点2并使其入度减一,这相当于删除了节点1向节点2发出的弧,对于节点2而言,删除后其入度为0,符合拓扑序列挑选规则

        3-如果输出的顶点数与图的顶点数相同说明拓扑序列有效

你可能感兴趣的:(图--拓扑排序)