AOV网络


AOV网络_第1张图片

  

在现代化管理中,人们常用有向图来描述和分析一项工程的计划和实施过程,一个工程常被分为多个小的子工程,这些子工程被称为活动(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
#include
#include
#include
#include"F:\QQPCmgr\documents\visual studio 2010\Projects\Graph\Graph_matrix\GraphAdjMatrix.h"
using namespace std;
template
void TopologicalSort(GraphAdjMatrix &targetG)
{
	int verticesNum = targetG.GetVerticesNum(); //获取图的顶点数目
	int *in = new int[verticesNum]; //临时存储顶点的入度信息
	targetG.GetInFormation(in); //调用图的接口,返回各个顶点的入度信息
	
	stack stk; //栈 用来实现排序的中转
	vector 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 大while

	if(count < verticesNum)
	{
		cout<<"count = "<::size_type idx = 0; idx < veci.size(); idx++)
		{
			cout<<"#"<

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