有向边表示活动,权值表示活动的持续时间,顶点表示事件。

只有一个开始点和完成点,称为源点、汇点,完成工程时间取决于从源点到汇点的最长路径长度,即在这条路径(关键路径)上所有活动的持续时间之和。关键路径上的活动都是关键活动,不按期完成就会影响整个工程的完成时间。

事件最早可能开始时间Ve[n],是从源点到顶点i的最长长度,需要正向计算取大得出。

事件最迟允许开始时间Vl[n],Vl[i]=Ve[n-1]-(i到n-1的最长路径长度)。超过该时间会影响汇点事件在Ve[n-1]完成,需要逆向计算取小得到。

源点和汇点有Ve[0]=Vl[0]=0,Ve[n-1]=Vl[n-1]

关键路径上的活动有Ve[i]=Vl[j]-活动(i,j)完成时间,用此判断关键活动。

在拓扑排序求Ve[i]和逆拓扑排序求Vl[i]时,所需时间为O(n+e),求各个活动的Ve[i]和Vl[j]-活动(i,j)完成时间所需时间为O(e),总花费时间仍为O(n+e)。

//  程序为了简化算法,假定在求关键路径之前已经对各顶点实现了拓扑排序,并按拓扑有序的顺序对各顶点重新进行了编号

template <class T,class E>
void CriticalPath(Graph<T,E>& G){
int i,j,k;
E Ae,Al,w;
int n=G.NumberOfVerticles();
E *Ve=new E[n]; //最早可能开始时间
E *Vl=new E[n]; //最迟必须开始时间
for (i=; i<n; i++) Ve[i]=;
for(i=; i<n; i++){ //正向计算Ve[]
j=G.getFirstNeighbor(i);
while(j!=-){
w=G.getWeight(i,j);
if(Ve[i]+w>Ve[j]) Ve[j]=Ve[i]+w;
j=G.getNextNeighbor(i,j);
}
}
Vl[n-]=Ve[n-];
for(j=n-; j>; j--){ //逆向计算Vl[]
k=G.getFirstNeighbor(j);
while(k!=-){
w=G.getWeight(j,k);
if(Vl[k]-w<Vl[j]) Vl[j]=Vl[k]-w;
k=G.getNextNeighbor(j,k);
}
}
for(i=; i<n; i++){
j=G.getFirstNeighbor(i);
while(j!=-){
Ae=Ve[i];
Al=Vl[j]-G.getweight(i,j);
if(Al==Ae) cout<<"<"<<G.getValue(i)<<","<<G.getValue(j)<<">"<<"是关键活动"<<endl; //活动是没有时间余量的关键活动,i必须在最早开始时间完成,否则会影响j在最迟开始时间完成
j=G.getNextNeighbor(i,j);
}
}
delete []Ve;
delete []Vl;
}

算法-图(4)用边表示活动的网络(AOE网络)Activity On Edge Network的更多相关文章

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

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

  2. 算法-图(3)用顶点表示活动的网络(AOV网络)Activity On Vertex NetWork

    对于给定的AOV网络,必须先判断是否存在有向环. 检测有向环是对AOV网络构造它的拓扑有序序列,即将各个顶点排列成一个线性有序的序列,使得AOV网络中所有直接前驱和直接后继关系都能得到满足. 这种构造 ...

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

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

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

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

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

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

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

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

  7. 树的常见算法&图的DFS和BFS

    树及二叉树: 树:(数据结构中常见的树) 树的定义

  8. 7-6-有向图强连通分量的Kosaraju算法-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第7章  图 - 有向图强连通分量的Kosaraju算法 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严 ...

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

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

随机推荐

  1. emwin显示汉字使用vs studio仿真和使用keil编写烧录的不同

    我用emwin是在新唐的开发板上练习的,所有我就去官网下了开发板的资料,别的开发板应该也有对应的资料,这些软件网上应该很容易搜得到 然后用GUIBuilder构建一个界面,再用FontArchitec ...

  2. 搭建vue项目的步骤

    新建vue脚手架 vue-element-cms步骤: 1. vue create ……………(文件名)---这里取为vue-element-cms 2. 命令行工具进入这个文件夹,安装路由依赖包 n ...

  3. 第四章 常用API(上)

    4.1.Object类 描述:该类是所有类的最终根类 方法 描述 public boolean equals(Object obj) 表示某个其它对象是否"等于"此对象 publi ...

  4. Day09_商品管理

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...

  5. (一)python 格式化 excel 格式

    需求: 客户通过 sftp 上传了一个 poc测试的 excel文件, 下到 云桌面 查看,发现一堆格式问题, 怎么办呢? 公司又不允许 吧文件下载到本地处理, 只能在 服务器上进行处理. 一堆的类型 ...

  6. 高阶NumPy知识图谱-《利用Python进行数据分析》

    所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载或者右击保存图片. 其他章 ...

  7. FPGA内部IP核DDS

    项目当中需要正弦信号与余弦信号,首先想到了DDS芯片,例如AD9833.AD9834.由于还需要用FPGA   做一些数据处理,后来干脆直接用FPGA 内部的DDSIP核,同时根据IP核内部的相位累加 ...

  8. 【问题记录】springMVC @Valid使用不生效问题

    问题描述 在网上找到如何使用@Valid注解后,就把用到的配置和jar包加上,然后测试发现一直不生效.下面是配置及解决方法 配置 1.引入依赖 2.添加相应的配置(springmvc配置文件) < ...

  9. JVM科普

    目录 再看前言 不完美的程序 Java发展史 JVM族谱 什么是广义的虚拟机? 什么是Java虚拟机(JVM)? 二刷周先生的<深入理解JVM>时,没想到已经出了第三版,拿着第二版的我在风 ...

  10. Android中Activity启动模式探索

    Android中启动模式(launchMode)分为standard, singleTop, singleTask, singleInstance四种,可通过AndroidManifest.xml文件 ...