【数据结构】AOV网与拓扑排序

一.AOV网的概念(Activity On Vertex Network)

        在一个表示工程的有向图中,用顶点表示活动,用表示活动之间的优先关系。这样的有向图为顶点表示活动的网,我们称为AOV网(Activity On Vertex Network)。

AOV网的特点:

(1)AOV网中的弧表示活动之间存在的某种制约关系。

(2)AOV网中不能出现回路。

二.拓扑排序的定义

拓扑序列:

设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列$v_1,v_2,...,v_n$称为一个拓扑序列,当且仅当满足下列条件:若从顶点$v_i$$v_j$有一条路径,则在顶点序列中顶点$v_i$必在$v_j$之前。

拓扑排序:

对一个有向图构造拓扑序列的过程

拓扑排序是对给定的AOV网判断网中是否存在环的一种算法,若网中所有顶点都在它的拓扑有序序列中,则该AOV网中必定不存在环。

三.拓扑排序的基本思想

(1)从AOV网中选择一个没有前驱的顶点并且输出;

(2)从AOV网中删除该顶点,并且删去所有以该顶点为头的的弧;

(3)重复上述两步,直到全部顶点都被输出,或AOV网中不存在没有前驱的顶点。

四.拓扑排序实现需要的数据结构

1.图的存储结构:

邻接表存储,在顶点表中增加一个入度域in

2.栈S:

存储所有无前驱的顶点

五.拓扑排序的伪代码

1.栈S初始化,累加器count初始化;

2.扫描顶点表,将没有前驱的顶点压栈;

3.当栈非空时循环:

        3.1 $v_j$ 保存弹栈元素,输出$v_j$ ,累加器加一;

        3.2 将顶点$v_j$ 的各个邻接点的入度减一;

        3.3 将新的入度为0的顶点入栈;

4.如果count

六.代码实现

#include 
#include 
#include 
using namespace std;

struct node{
    int number;
    struct node *next;
};

struct vertex{
    int in;//入度
    char vertex;
    struct node *firstedge;
};

class ALGraph{
private:
    int vertexNum,arcNum;
    struct vertex *v;
public:
    ALGraph(int n,int e);
    ~ALGraph();
    void topology();
    void display();
};

int main(int argc, const char * argv[]) {
    ALGraph G(7, 10);
    //G.display();
    G.topology();
    return 0;
}

ALGraph::ALGraph(int n,int e){
    int p,q;
    struct node *s;
    vertexNum=n;
    arcNum=e;
    v=new struct vertex[n];
    
    for(int i=0;i>p>>q;
        s=new struct node;
        s->number=q;
        s->next=v[p].firstedge;
        v[p].firstedge=s;
        v[q].in++;
    }
    
}
ALGraph::~ALGraph(){
    struct node *p,*q;
    for(int i=0;inext;
            delete p;
            p=q;
        }
        v[i].firstedge=NULL;
    }
    delete [] v;
}

void ALGraph::topology(){
    stack  s;
    int count=0,i,j;
    struct vertex vj;
    
    for(i=0;inumber;
            v[j].in--;
            if(v[j].in==0){
                s.push(v[j]);
            }
            p=p->next;
        }
    }
    if(count!=vertexNum){
        cout<<"该图中有回路!!!"<";
            char c=p->number+'a';
            cout<next;
        }
        
    }
}

你可能感兴趣的:(数据结构与算法,数据结构,算法)