在生活、工作中进行一项任务,必须有先后顺序,这就是流程图,在流程图中有if分支,也就是下一个活动的展开,可能上一次活动中所有分支执行完毕,这样就形成了拓扑结构。接入项目中比较简单,我们可以通过链表表示项目之间各个活动的关系,当项目流程比较复杂时,我们需要有向图来描述这种关系,而且是不能循环的有向图,我们称之为有向无环图。

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的有限关系,这样的有向图为顶点表是活动的图,成为AOV网(Activity On Vertex Network)。在AOV网中弧表示活动之间的某种约束关系。

浅谈数据结构-拓扑排序

一个AOV网应该是一个有向无环图,即不应该带有回路,因为若带有回路,则回路上的所有活动都无法进行。如图3-6是一个具有三个顶点的回路,由<A,B>边可得B活动必须在A活动之后,由<B,C>边可得C活动必须在B活动之后,所以推出C活动必然在A活动之后,但由<C,A>边可得C活动必须在A活动之前,从而出现矛盾,使每一项活动都无法进行。这种情况若在程序中出现,则称为死锁或死循环,是应该必须避免的。

    在AOV网中,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面,我们把此序列叫做拓扑序列(Topological order),由AOV网构造拓扑序列的过程叫做拓扑排序(Topological sort)。AOV网的拓扑序列不是唯一的,满足上述定义的任一线性序列都称作它的拓扑序列。

从AOV网中选取一个入度为0的顶点输出,然后删除此顶点,并删除以此顶点为尾的弧,继续重复此操作,直到输出全部顶点或者AOV网中不存在入度为0的顶点为止。 在左图中入度为0的点位c1和c2,如按照拓扑排序算法进行运算结果为:

(1) C1,C8,C9,C2,C3,C5,C4,C7,C6

(2) C2,C1,C3,C5,C4,C6,C8,C9,C7

(3) C1,C2,C3,C8,C9,C5,C4,C6,C7

    由AOV网构造出拓扑序列的实际意义是:如果按照拓扑序列中的顶点次序,在开始每一项活动时,能够保证它的所有前驱活动都已完成,从而使整个工程顺序进行,不会出现冲突的情况。

二、算法分析

  1. 从AOV网络中删除入度为0的顶点;有入度这个概念,则用链表的存储结构储存数据。
    //边表结点
    typedef struct EdgeNode
    {
        int nNodevex;     //邻接点的点表中结点的坐标
        EdgeType nNodeWeight;   //用于网图中边的权值
        EdgeNode* next;       //链域,指向下一个邻接点
    }EdgeNode,*pEdgeNode;
    
    typedef struct VertexNodeAdv
    {
        int in;                  //顶点的度
        VertexType nNodeData;   //顶点表中存储的数据
        pEdgeNode pFirstNode;   //顶点表和边表中关联指针,指向边表头指针
    }VertexNodeAdv,*pVertexNodeAdv,VertexListAdv[MAXVEX];;
    
    
    //图结构
    typedef struct
    {
        VertexListAdv vertexList;
        int numVertess,numEdges;
    }GraphListAdv;
    存储结构

相关文章: