对于给定的AOV网络,必须先判断是否存在有向环。

检测有向环是对AOV网络构造它的拓扑有序序列,即将各个顶点排列成一个线性有序的序列,使得AOV网络中所有直接前驱和直接后继关系都能得到满足。

这种构造AOV网络全部顶点的拓扑有序序列的运算叫做拓扑排序,为了实现拓扑排序,需要增加数组count[]记录各个顶点的入度,并组织一个栈S组织所有入度为0的顶点。每当访问一个顶点并删除与它相关联的边时,这些边的另一端点入度减1,入度减至0的结点入栈。

为了建立入度为0的顶点栈,可以不另外分配存储空间,直接利用入度为0的顶点的count[]数组元素。

设立栈顶指针top,指示当前栈顶(某一个入度为0的顶点)的位置。栈初始化位置为-1,表示空栈。非空栈的栈顶指向次栈顶一直往下指向栈底再指向-1。

如果AOV网络n顶点e边。搜索入度为0的结点建立链式栈所需时间为O(n)。n个顶点各进栈、出栈、输出一次,(如果n次循环完成前就栈空,说明网络中有回路)。顶点入度减1的运算执行了e次,所以总时间复杂度为O(n+e)。

template <class T,class E>
void TopologicalSort(Graph<T,E>& G){
int i,j,w,v;
int top=-;
int n=G.NumberOfVerticles();
int *count=new int[n]; //入度数组兼入度为0顶点栈
for(i=;i<n;i++) count[i]=;
cin>>i>>j; //输入一条从i到j的边
while(i>- && i<n && j>- && j<n){
G.insertEdge(i,j);
count[j]++; //j的入度加1
cin>>i>>j;
}
for(i=;i<n;i++)
if(count[i]==){
count[i]=top; //原栈顶元素放在count[i]中
top=i; //top指向新栈顶
}
for(i=;i<n;i++) //n个结点各出栈一次、输出一次
if(top==-){ //中途栈空,网络中有回路
cout<<"网络中有回路!"<<endl;
return;
}
else {
v=top; //位于栈顶顶顶点位置记为v
top=count[top]; //top退到次栈顶
cout<<G.getValue(v)<<""<<endl;
w=G.GetFirstNeighbor(v);
while(w!=-){
if(--count[w]==){ //当邻顶点入度为0时
count[w]=top;top=w; //进栈
}
w=G.GetNextNeighbor(v,w);
}
}
}

算法-图(3)用顶点表示活动的网络(AOV网络)Activity On Vertex NetWork的更多相关文章

  1. python数据结构与算法——图的最短路径(Floyd-Warshall算法)

    使用Floyd-Warshall算法 求图两点之间的最短路径 不允许有负权边,时间复杂度高,思路简单 # 城市地图(字典的字典) # 字典的第1个键为起点城市,第2个键为目标城市其键值为两个城市间的直 ...

  2. python数据结构与算法——图的基本实现及迭代器

    本文参考自<复杂性思考>一书的第二章,并给出这一章节里我的习题解答. (这书不到120页纸,要卖50块!!,一开始以为很厚的样子,拿回来一看,尼玛.....代码很少,给点提示,然后让读者自 ...

  3. 用rose画UML图(用例图,活动图)

    用rose画UML图(用例图,活动图) 首先,安装rose2003,电脑从win8升到win10以后,发现win10并不支持rose2003的安装,换了rose2007以后,发现也不可以. 解决途径: ...

  4. python数据结构与算法——图的广度优先和深度优先的算法

    根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 每次循环从队列弹出一个结点 将该节点的所有相连结点放入队列,并标记已被发现 通过队列,将迷宫路口所有的门打 ...

  5. [golang]图片按中心旋转后,新图的左顶点位置的偏移量

    1 前言 图片按中心旋转后,新图的左顶点位置的偏移量 2 代码 func OffsetXYAfterRotationCore(W, H, L, T, Angle float64) (x, y floa ...

  6. AOV网络和Kahn算法拓扑排序

    1.AOV与DAG 活动网络可以用来描述生产计划.施工过程.生产流程.程序流程等工程中各子工程的安排问题.   一般一个工程可以分成若干个子工程,这些子工程称为活动(Activity).完成了这些活动 ...

  7. 算法-图(4)用边表示活动的网络(AOE网络)Activity On Edge Network

    有向边表示活动,权值表示活动的持续时间,顶点表示事件. 只有一个开始点和完成点,称为源点.汇点,完成工程时间取决于从源点到汇点的最长路径长度,即在这条路径(关键路径)上所有活动的持续时间之和.关键路径 ...

  8. python数据结构与算法——图的最短路径(Dijkstra算法)

    # Dijkstra算法——通过边实现松弛 # 指定一个点到其他各顶点的路径——单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, ...

  9. python数据结构与算法——图的最短路径(Bellman-Ford算法)解决负权边

    # Bellman-Ford核心算法 # 对于一个包含n个顶点,m条边的图, 计算源点到任意点的最短距离 # 循环n-1轮,每轮对m条边进行一次松弛操作 # 定理: # 在一个含有n个顶点的图中,任意 ...

随机推荐

  1. paramiko上传文件到Linux

    一.传输单个文件到Linux服务器 import paramiko transport = paramiko.Transport(('host',22)) transport.connect(user ...

  2. docker容器dns之resolv.conf

    基础信息 操作系统:CentOS Linux release 7.2.1511 (Core) Docker版本:Server Version: 1.9.1 拉取基础镜像 Rhel:7.2 为直接从do ...

  3. 对于AES和RSA的个人理解

    最近学习爬虫 遇到一些加密的坑 然后了解到了AES和RSA  记录一下 AES 1.什么是AES AES是一种对称的加密算法,运行要求低,不需要计算机有非常高的处理能力和大的内存, 加密速度很快: 对 ...

  4. 如何部署redis服务

    使用工具 redis-64-3.2.100 部署系统 windows server 2012R2 1.下载安装redis-64-3.2.100安装包,下载地址:https://github.com/m ...

  5. PHP array_unshift() 函数

    实例 插入元素 "blue" 到数组中: <?php$a=array("a"=>"red","b"=> ...

  6. JWT到底是个什么鬼?

    前面一篇我们了解了微服务安全认证架构是如何演进而来的,但是发现v2.5架构仍然较重,有没有轻量级一点的方法呢?其实业界早已有了实践,它就是基于JWT的安全认证架构.JWT到底是个什么鬼呢?本篇为你解答 ...

  7. Maven知识记录(一)初识Maven私服

    Maven知识记录(一)初识Maven私服 什么是maven私服 私服即私有的仓库.maven把存放文件的地方叫做仓库,我们可以理解成我门家中的储物间.而maven把存放文件的具体位置叫做坐标.我们项 ...

  8. Python格式化字符串(f,F,format,%)

    # 格式化字符串: 在字符串前加上 f 或者 F 使用 {变量名} 的形式来使用变量名的值 year = 2020 event = 'Referendum' value = f'Results of ...

  9. JVM系列之:从汇编角度分析Volatile

    目录 简介 重排序 写的内存屏障 非lock和LazySet 读的性能 总结 简介 Volatile关键字对熟悉java多线程的朋友来说,应该很熟悉了.Volatile是JMM(Java Memory ...

  10. 有用的20个Python代码段

    Python是一种非BS编程语言.设计简单和易读性是它广受欢迎的两大原因.正如Python的宗旨:美丽胜于丑陋,显式胜于隐式. 记住一些帮助提高编码设计的常用小诀窍是有用的.在必要时刻,这些小诀窍能够 ...