AOV网络

来源:互联网 发布:岛风go软件打不开 编辑:程序博客网 时间:2024/04/28 06:25

  

在现代化管理中,人们常用有向图来描述和分析一项工程的计划和实施过程,一个工程常被分为多个小的子工程,这些子工程被称为活动(Activity),在有向图中若以顶点表示活动,有向边表示活动之间的先后关系,这样的图简称为AOV网。如下图是计算机专业课程之间的先后关系:

  图片注释:基础知识课程应先于其它所有课程,pascal语言课程应先于数据结构
  用顶点表示活动,用弧表示活动间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Network),简称AOV网。
  在网中,若从顶点i到顶点j有一条有向路径,则i是j 的前驱

  AOV网是一种有向无环图。

算法如下:

1:stack  S //用来存储入度为0的顶点

2:count //用于输出的顶点计数器

3:扫描所有的顶点,如果入度为0,则进栈

4:取出栈顶顶点,输出,计数器加1,然后查找该顶点的所有邻接顶点,将这些顶点的入度减1,如果入度减至0,则进栈

5:如果栈为空则停止循环,如果不为空继续执行第三步。

6:循环退出后,检测计数器与顶点数目是否相等,如果计数器<顶点数目,则存在回路,不能拓扑排序成一个序列;如果计数器=定点数目,则AOV网络可行。


下面代码:

#include<iostream>#include<fstream>#include<stack>#include<vector>#include"F:\QQPCmgr\documents\visual studio 2010\Projects\Graph\Graph_matrix\GraphAdjMatrix.h"using namespace std;template<class T, class E>void TopologicalSort(GraphAdjMatrix<T,E> &targetG){int verticesNum = targetG.GetVerticesNum(); //获取图的顶点数目int *in = new int[verticesNum]; //临时存储顶点的入度信息targetG.GetInFormation(in); //调用图的接口,返回各个顶点的入度信息stack<int> stk; //栈 用来实现排序的中转vector<int> veci; //容器 顺序存储每一个顶点for(int i = 0; i < verticesNum; i++){if(in[i] == 0){stk.push(i); //扫描入度数组,把初始化状态入度为0的顶点进栈}}int count = 0; //顶点计数器int temp;int adj;int nullIdx = targetG.GetNullIdx();while(stk.empty() == false){temp = stk.top();stk.pop();veci.push_back(temp);count++;adj = targetG.GetVerticesPos(targetG.GetFirstNeighbor(temp)); //获取当前顶点的邻接点while(adj != nullIdx){in[adj]--;if(in[adj] == 0){stk.push(adj);}adj = targetG.GetVerticesPos(targetG.GetNextNeighbor(temp, adj));}// end of 小while}// end of 大whileif(count < verticesNum){cout<<"count = "<<count<<endl;cout<<"图中有回路,不能形成拓扑排序序列"<<endl;}else{cout<<"拓扑排序序列:"<<endl;for(vector<int>::size_type idx = 0; idx < veci.size(); idx++){cout<<"#"<<idx<<":"<<veci[idx]<<"  ";}cout<<endl;}}

原创粉丝点击