算法-图(4)用边表示活动的网络(AOE网络)Activity On Edge Network
有向边表示活动,权值表示活动的持续时间,顶点表示事件。
只有一个开始点和完成点,称为源点、汇点,完成工程时间取决于从源点到汇点的最长路径长度,即在这条路径(关键路径)上所有活动的持续时间之和。关键路径上的活动都是关键活动,不按期完成就会影响整个工程的完成时间。
事件最早可能开始时间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的更多相关文章
- 用rose画UML图(用例图,活动图)
用rose画UML图(用例图,活动图) 首先,安装rose2003,电脑从win8升到win10以后,发现win10并不支持rose2003的安装,换了rose2007以后,发现也不可以. 解决途径: ...
- 算法-图(3)用顶点表示活动的网络(AOV网络)Activity On Vertex NetWork
对于给定的AOV网络,必须先判断是否存在有向环. 检测有向环是对AOV网络构造它的拓扑有序序列,即将各个顶点排列成一个线性有序的序列,使得AOV网络中所有直接前驱和直接后继关系都能得到满足. 这种构造 ...
- python数据结构与算法——图的最短路径(Floyd-Warshall算法)
使用Floyd-Warshall算法 求图两点之间的最短路径 不允许有负权边,时间复杂度高,思路简单 # 城市地图(字典的字典) # 字典的第1个键为起点城市,第2个键为目标城市其键值为两个城市间的直 ...
- python数据结构与算法——图的最短路径(Dijkstra算法)
# Dijkstra算法——通过边实现松弛 # 指定一个点到其他各顶点的路径——单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, ...
- python数据结构与算法——图的最短路径(Bellman-Ford算法)解决负权边
# Bellman-Ford核心算法 # 对于一个包含n个顶点,m条边的图, 计算源点到任意点的最短距离 # 循环n-1轮,每轮对m条边进行一次松弛操作 # 定理: # 在一个含有n个顶点的图中,任意 ...
- python数据结构与算法——图的基本实现及迭代器
本文参考自<复杂性思考>一书的第二章,并给出这一章节里我的习题解答. (这书不到120页纸,要卖50块!!,一开始以为很厚的样子,拿回来一看,尼玛.....代码很少,给点提示,然后让读者自 ...
- 树的常见算法&图的DFS和BFS
树及二叉树: 树:(数据结构中常见的树) 树的定义
- 7-6-有向图强连通分量的Kosaraju算法-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第7章 图 - 有向图强连通分量的Kosaraju算法 ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严 ...
- python数据结构与算法——图的广度优先和深度优先的算法
根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 每次循环从队列弹出一个结点 将该节点的所有相连结点放入队列,并标记已被发现 通过队列,将迷宫路口所有的门打 ...
随机推荐
- laravel 验证码使用示例
一.去https://packagist.org/网站搜索验证码的代码依赖,关键词:captcha 地址:https://packagist.org/packages/mews/captcha 二.环 ...
- vuex多多,怎么当好一个奶妈
前言 vue 本身更偏向于 view 层的框架,尤大大并没有一开始就给他一个完整的 mvvm 架构. 在 vue 的世界里 vuex 是用来实现 mvvm 中关键的 vm 层(视图模型层),你甚至可以 ...
- Nginx配置各种响应头防止XSS,点击劫持,frame恶意攻击
为什么要配置HTTP响应头? 不知道各位有没有被各类XSS攻击.点击劫持 (ClickJacking. frame 恶意引用等等方式骚扰过,百度联盟被封就有这些攻击的功劳在里面.为此一直都在搜寻相关防 ...
- Spring Boot 集成 WebSocket 实现服务端推送消息到客户端
假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是 HTTP 1.1,通常会开启 ajax 请求询问服务端是否有更新,通过定时器反复轮询服务端响应的 ...
- 一分钟玩转 Spring IoC
前言 「上一篇文章」我们对 Spring 有了初步的认识,而 Spring 全家桶中几乎所有组件都是依赖于 IoC 的. 刚开始听到 IoC,会觉得特别高大上,但其实掰开了很简单. 跟着我的脚步,一文 ...
- Python实现数据结构 图
邻接矩阵 class Vertex: def __init__(self, node): self.id = node # Mark all nodes unvisited self.visited ...
- js POST调用api接口时,由于OPTIONS请求导致服务器异常
1.学习心得 当你搜到这个问题时,就表示你已经知道了脚本POST请求接口时,会先执行一次OPTIONS类型的请求.至于为什么会这样,在此就不做描述了,想知道的小伙伴可以查一下:本文主要将我在现实中遇到 ...
- PHP abs() 函数
实例 返回不同数的绝对值: <?phpecho(abs(6.7) . "<br>");echo(abs(-6.7) . "<br>" ...
- 虚拟机安装Centos(VirtulBox)
阿里云服务器本月底到期了,之前自己犹豫不觉没上279元3年服务器的车,但是又要用linux,所以有了这篇文章. VirtulBox 一款开源的虚拟化主机应用,可以实现一台电脑上运行多个操作系统(Lin ...
- 33-关键字:interface
interface:接口 1.使用说明: * 1.接口使用interface来定义 * 2.Java中,接口和类是并列的两个结构 * 3.如何定义接口:定义接口中的成员 * 3.1 JDK7及以前:只 ...