有关关键路径的概念和算法
AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动的持续时间,称这样的有向图叫做边表示活动的网,简称AOE网。AOE网中没有入边的顶点称为始点(或源点),没有出边的顶点称为终点(或汇点)。
AOE网的性质:
⑴ 只有在某顶点所代表的事件发生后,从该顶点出发的各活动才能开始;
⑵ 只有在进入某顶点的各活动都结束,该顶点所代表的事件才能发生。
关键路径:在AOE网中,从始点到终点具有最大路径长度(该路径上的各个活动所持续的时间之和)的路径称为关键路径。
关键活动:关键路径上的活动称为关键活动。关键活动:e[i]=l[i]的活动
由于AOE网中的某些活动能够同时进行,故完成整个工程所必须花费的时间应该为始点到终点的最大路径长度。关键路径长度是整个工程所需的最短工期。
与关键活动有关的量:
⑴ 事件的最早发生时间ve[k]
ve[k]是指从始点开始到顶点vk的最大路径长度。这个长度决定了所有从顶点vk发出的活动能够开工的最早时间。
⑵ 事件的最迟发生时间vl[k]
vl[k]是指在不推迟整个工期的前提下,事件vk允许的最晚发生时间。
⑶ 活动的最早开始时间e[i]
若活动ai是由弧<vk , vj>表示,则活动ai的最早开始时间应等于事件vk的最早发生时间。因此,有:e[i]=ve[k]
⑷ 活动的最晚开始时间l[i]
活动ai的最晚开始时间是指,在不推迟整个工期的前提下, ai必须开始的最晚时间。若ai由弧<vk,vj>表示,则ai的最晚开始时间要保证事件vj的最迟发生时间不拖后。因此,有:l[i]=vl[j]-len<vk,vj>
示例:
所以:
代码实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
Status TopologicalOrder(ALGraph G, Stack &T)
{
// 有向网G采用邻接表存储结构,求各顶点事件的最早发生时间ve(全局变量)。
// T为拓扑序列定点栈,S为零入度顶点栈。
// 若G无回路,则用栈T返回G的一个拓扑序列,且函数值为OK,否则为ERROR。
Stack S;
int count=0,k;
char indegree[40];
ArcNode *p;
InitStack(S);
FindInDegree(G, indegree); // 对各顶点求入度indegree[0..vernum-1]
for ( int j=0; j<G.vexnum; ++j) // 建零入度顶点栈S
if (indegree[j]==0)
Push(S, j); // 入度为0者进栈
InitStack(T); //建拓扑序列顶点栈T
count = 0;
for ( int i=0; i<G.vexnum; i++)
ve[i] = 0; // 初始化
while (!StackEmpty(S))
{
Pop(S, j); Push(T, j); ++count; // j号顶点入T栈并计数
for (p=G.vertices[j].firstarc; p; p=p->nextarc)
{
k = p->adjvex; // 对j号顶点的每个邻接点的入度减1
if (--indegree[k] == 0) Push(S, k); // 若入度减为0,则入栈
if (ve[j]+p->info > ve[k]) ve[k] = ve[j]+p->info;
} //for *(p->info)=dut(<j,k>)
}
if (count<G.vexnum)
return ERROR; // 该有向网有回路
else
return OK;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
Status CriticalPath(ALGraph G)
{
// G为有向网,输出G的各项关键活动。
Stack T;
int a,j,k,el,ee,dut;
char tag;
ArcNode *p;
if (!TopologicalOrder(G, T))
return ERROR;
for (a=0; a<G.vexnum; a++)
vl[a] = ve[G.vexnum-1]; // 初始化顶点事件的最迟发生时间
while (!StackEmpty(T)) // 按拓扑逆序求各顶点的vl值
for (Pop(T, j), p=G.vertices[j].firstarc; p; p=p->nextarc)
{
k=p->adjvex; dut=p->info; //dut<j,k>
if (vl[k]-dut < vl[j])
vl[j] = vl[k]-dut;
}
for (j=0; j<G.vexnum; ++j) // 求ee,el和关键活动
for (p=G.vertices[j].firstarc; p; p=p->nextarc)
{
k=p->adjvex;dut=p->info;
ee = ve[j]; el = vl[k]-dut;
tag = (ee==el) ? '*' : ' ' ;
printf (j, k, dut, ee, el, tag); // 输出关键活动
}
return OK;
}
|
有关关键路径的概念和算法相关推荐
- 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径
文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...
- 数据挖掘和机器学习:基本概念和算法(附电子书PPT)
来源:专知本文多图,建议阅读5分钟这本书奠定了数据分析.模式挖掘.聚类.分类和回归的基础,集中在算法和潜在的代数.几何和概率概念上. 数据挖掘和机器学习的基本算法构成了数据科学的基础,利用自动化方法分 ...
- 图计算思维与实践 (二)核心概念与算法
前言 在前文<图计算思维与实践 (一)概览>中,我们介绍了以知识图谱.网络分析为主的图计算的应用,阐述了图思维的方式.本文我们将进入第二部分:图相关的核心概念与算法,这些是进行图探索的基础 ...
- 《数据挖掘导论》学习 | 第八章 聚类分析:基本概念和算法
目录 第八章 聚类分析:基本概念和算法 概述 不同的聚类类型 不同的簇类型 K均值 基本K均值算法 K均值:附加的问题 二分K均值 K均值和不同的簇类型 优点与缺点 K均值作为优化问题 凝聚层次聚类 ...
- 计算机算法的概念教案,“算法的概念”教学设计.pdf
2017年第 1-2期 中国数学教育 №1- 2.2017 (总第169- 70期) ZHONGGUO SHUXUEJA|oYU Genera1.No16争一170 "算法的概念''教学设计 ...
- 人工智能历史、概念、算法与技术 概括与综述(一)
经过前五章的阅读,让我脑海中从整体上建立了三个世界的基本底层架构,之后逐渐了解到数据的概念,包括定义.形式和度量等做进一步系统和深入的探讨,还讨论关于数据的几个基本科学法则并讨论这些法则在数据科学技术 ...
- 关键路径例题图表_算法学习记录-图——应用之关键路径(Critical Path)
之前我们介绍过,在一个工程中我们关心两个问题: (1)工程是否顺利进行 (2)整个工程最短时间. 之前我们优先关心的是顶点(AOV),同样我们也可以优先关心边(同理有AOE).(Activity On ...
- “分布式哈希”和“一致性哈希”的概念与算法实现
分布式哈希和一致性哈希是分布式存储和p2p网络中说的比较多的两个概念了.介绍的论文很多,这里做一个入门性质的介绍. 分布式哈希(DHT) 两个key point:每个节点只维护一部分路由:每个节点只存 ...
- 比特币核心概念及算法
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. bitcoin项目地址位于github仓库,当前各种"币",基本都是从抄写bitcoin代码开始起步 ...
最新文章
- 湖南工程师用中文编写操作系统,还发明了甲、乙、丙语言???
- python3.x中如何实现print不换行
- Python中国际化(i18n)完整指南
- 「神策 2020 数据驱动用户大会」开幕在即,10 月 13-14 日,八城联动·北京场,带你一起见证数据的力量!
- 手撕 CNN 经典网络之 VGGNet(PyTorch实战篇)
- iis5.1/6.0/7.0+ 配置url重写 无扩展名伪静态
- Flask 上下文管理-- (session,request,current_app的传递)--类似本地线程实现,以及多app应用...
- JAVA8的学习笔记之Collection
- 订阅服务器无法显示,订阅疑难解答
- 微信小程序图片上传并移除
- 学习笔记(16):程序员的数学:微积分-常用导数(一):最常用到的技巧
- webpy使用说明(二)
- 物联网卡企业的选择应该怎么避雷
- (转)(异常分析) org.hibernate.MappingException: entity class not found
- std::forward理解
- html+css写三角形
- 科学计算机如何开机,计算器上关机和开机键分别是什么?
- jitter单位_时间抖动(jitter)的概念及其分析方法
- c++数独游戏3.0
- 在字符串中查找一个字符
热门文章
- Codeforces Round #694 (Div. 2) F. Strange Housing (贪心思维)
- 信号积分变换的公式推导以及几个例子
- MapGuide 初步
- 广州Java工程师平均薪资_【广州恒生电子工资】java开发工程师待遇-看准网
- 使用 Python 读取 json 格式文件并查重
- 宿舍管理系统(Java毕业设计)
- Chrome version must be 70 and 73
- red hat enterprise linux yum,Red Hat Enterprise Linux7.x(RHEL7.x)更换CentOS YUM源
- 什么是JavaBeans
- 【元胞自动机】基于元胞自动机模拟双通道人群疏散含Matlab源码