拓扑排序与关键路径(AOV网和AOE网)
一、AOV网(Activity On Vertex Network)
在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称为AOV网。
不能存在回路。
拓扑序列
设G(V,E)是一个具有n个顶点的有向图,V中的顶点序列满足若从顶点v~i~到v~j~有一条路径,则在顶点序列中v~i~必须在v~j~之前,称这样的一个顶点为拓扑序列。
二、拓扑排序算法
基本思路
从AOV网中选择一个入度为0的顶点输出,然后删去此顶点,并删除以此顶点为尾的弧,继续重复此步骤,直到输出全部顶点或者AOV网中不存在入度为0的点为止。
AOV网要一直删除顶点,所以用邻接表表示图比较合适。考虑到算法中要查找入度为0的点,所以在原顶点结点中增加一个入度域即可。
代码如下:
//拓扑排序private static boolean TopologicalSort(){EdgeNode edgeNode = new EdgeNode();int i,k;int gettop = 0;int top = 0; //栈指针下标int count = 0; //输出顶点的个数Stack<Integer> stack = new Stack<>();for(i = 0; i < adjList.verNum; i++){if(adjList.vertexNodes[i].in == 0) {stack.push(i);}}while (! stack.empty()){gettop = stack.pop();System.out.print(adjList.vertexNodes[gettop].data+" -> ");count++;for(edgeNode = adjList.vertexNodes[gettop].firstEdge; edgeNode != null; edgeNode = edgeNode.next){k = edgeNode.adjvex;if(--adjList.vertexNodes[k].in == 0)stack.push(k);}}return count >= adjList.verNum;}
三、AOE网
在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,称为AOE网(Activity On Edge Network)。
关键路径
路径上各个活动所持续的时间之和称为路径长度,从源点到汇点具有最大长度的路径叫关键路径,在关键路径上的活动叫关键活动。
- 在工程活动中,耗费的时间取决于关键路径的长度;
- 拓扑排序解决了一个工程能否顺利进行的问题,关键路径解决了工程完成所需的最短时间问题。
算法基本思想
找到所有活动的最早开始时间和最晚开始时间,比较它们,如果相等就意味着此活动是关键活动,活动间的路径是关键路径,反之则不是。
代码如下:
//求关键路径private static void CriticalPath(){ltv = new int[adjList.verNum];EdgeNode edgeNode = new EdgeNode();int i,gettop,j;int k = 0;int ete=0;int lte = 0; //最早发生时间和最迟发生时间if(TopologicalSort()) {for (i = 0; i < adjList.verNum; i++) {ltv[i] = etv[adjList.verNum - 1];}while (!stack2.empty()) {gettop = stack2.pop();for (edgeNode = adjList.vertexNodes[gettop].firstEdge; edgeNode != null; edgeNode = edgeNode.next) {k = edgeNode.adjvex;if (ltv[k] - edgeNode.weight < ltv[gettop]) {ltv[gettop] = ltv[k] - edgeNode.weight;}}}for (j = 0; j < adjList.verNum; j++) {for (edgeNode = adjList.vertexNodes[j].firstEdge; edgeNode != null; edgeNode = edgeNode.next) {k = edgeNode.adjvex;ete = etv[j];lte = ltv[k] - edgeNode.weight;if (ete == lte) {System.out.printf("<v%d, v%d> length: %d \n ", j,k, edgeNode.weight);}}}}}//拓扑排序private static boolean TopologicalSort(){etv = new int[adjList.verNum];EdgeNode edgeNode = new EdgeNode();int i,k;int gettop = 0;int count = 0; //输出顶点的个数Stack<Integer> stack = new Stack<>();for(i = 0; i < adjList.verNum; i++){if(adjList.vertexNodes[i].in == 0) {stack.push(i);}}for (i = 0; i < adjList.verNum; i++){etv[i] = 0;}System.out.println("拓扑序列为:");while (! stack.empty()){gettop = stack.pop();System.out.print(adjList.vertexNodes[gettop].data+" -> ");count++;stack2.push(gettop); // 拓扑序列压栈for(edgeNode = adjList.vertexNodes[gettop].firstEdge; edgeNode != null; edgeNode = edgeNode.next){k = edgeNode.adjvex;if(--adjList.vertexNodes[k].in == 0)stack.push(k);if(etv[gettop]+edgeNode.weight > etv[k]){ //求各顶点最早发生时间etv[k] = etv[gettop] + edgeNode.weight;}}}System.out.println();return count >= adjList.verNum;}
时间复杂度为O(n+e),e为边数。
本文用到的代码链接
拓扑排序与关键路径(AOV网和AOE网)相关推荐
- 算法笔记_图算法专题_关键路径 AOV网和AOE网
关键路径 1.基本概念 1.AOV网:顶点活动网,是指用顶点表示活动,而用边集表示活动优先关系的有向无环图. 2.AOE网:边活动网,是指用带权的边集表示活动,而用顶点表示事件的有向无环图. AOV网 ...
- 拓扑排序和关键路径课程设计
目录 1. 设计任务书... 3 1.1设计任务... 3 1.2程序功能... 3 1.3运行环境... 3 2. 本组课题... 3 2.1课题... 3 2.2本人任务... 3 3 ...
- C语言数据结构与算法---拓扑排序、关键路径
文章目录 一. 有向无环图 二. 拓扑排序 1. 分析 2. 拓扑排序的定义及方法 3. 拓扑排序的重要应用 4. 拓扑排序的算法实现 三. 关键路径 1.分析 2. 什么是关键路径 3. 关键路径的 ...
- 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径
文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...
- 图的应用(AOV网、AOE网、图连通性)
图的应用(AOV网.AOE网.图连通性): AOV网: 在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,称这样的有向图为顶点表示活动的网,简称AOV网. AOV网特点: 1.AO ...
- 【算法】 AOV网与AOE网
AOV网 我们把施工过程.生产流程.软件开发.教学安排等都当成一个项目工程来对待,所有的工程都可以分为若干个"活动"的子工程.有很多场景对顺序有严格的要求,比如说建造一栋大楼必须先 ...
- 考研复习之数据结构笔记(十二)图(下)(图的应用,包含最小生成树、最短路径、拓扑排序、关键路径以及单元小结)
目录 一.图的应用 1.1 最小生成树 (1)基本概念与问题引入 (2)Prim(普里姆)算法 (3)Kruskal(克鲁斯卡尔)算法 1.2 最短路径 (1)基本概念与问题引入 (2)Dijkstr ...
- 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法
大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...
- 超详细讲解实现拓扑排序、关键路径
今天,小编带着大家来学习图中非常重要的一环,拓扑排序和关键路径! 目录 一. 绪论--实际应用 二. 拓扑排序 (一).含义 (二).实现原理 (三).代码实现 三. 关键路径 (一).含义 (二). ...
最新文章
- 李飞飞团队最新论文:基于anchor关键点的类别级物体6D位姿跟踪
- Intel汇编语言程序设计学习-第六章 条件处理-下
- mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁
- IDEA使用技巧整理
- 这又何止呢的openeim002
- Posix线程编程指南(4) 线程终止
- c语言abs作用是什么意思,c语言fabs()是什么意思?和abs()有什么区别
- uni-app 微信小程序启用组件按需注入
- 腾讯广告算法大赛2019
- python把所有txt文件整合在一起(步道乐跑题库)
- 【如何编码实现一个随机点名器】
- MTCNN中的重叠度IOU和非极大值抑制NMS原理及Python实现
- Memcache教程
- 如何从零开发一个低代码平台,有哪些成熟技术组件可用
- 英伟达驱动安装(华为makebook13-2018 NVIDIA-GeForce-MX150)
- ZYNQ 之PS 和PL 互联技术之AXI
- 无人驾驶汽车系统入门(十九)——分层有限状态机和无人车行为规划
- 安装配置sublime text2 最全教程
- macOS上HomeBrew安装软件慢的解决方法
- CentOS 远程连接不上问题的解决