关键路径的概念和算法

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由弧<vkvj>表示,则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;
    intcount=0,k;
    charindegree[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(inti=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)
        returnERROR;  // 该有向网有回路
    else
        returnOK;
}

 

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;
    inta,j,k,el,ee,dut;
    chartag;
    ArcNode *p;
    if(!TopologicalOrder(G, T))
        returnERROR;
    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);  // 输出关键活动
        }
    returnOK;
}

转载于:https://www.cnblogs.com/hongyang/articles/3407666.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

160 - 51 DueList.6

环境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查壳 发现程序没有加壳&#xff0c;那么我们可以直接分析了。 0x01 分析 运行程序看一看 看到错误信息的字符串后我们可以直接搜索了。 可以看到程序会比较输入的长度是否为8位&#xff0c;如…

宽带上行速率和下行速率的区别

本文由广州宽带网http://www.ymeibai.com/整理发布&#xff0c;广州电信宽带报装&#xff0c;上广州宽带网。 我们一般所说的4M宽带&#xff0c;6M宽带&#xff0c;都是指宽带的下行速率&#xff0c;可以理解为就是下载的速度&#xff0c;平时我们用迅雷、或者网页下载软件时&a…

LazyInitializationException--由于session关闭引发的异常

1,页面中进行person.department.departmentName的读取 2,Action 中只读取了person&#xff0c;事务作用在Service的方法中 3,后台会有org.hibernate.LazyInitializationException出现 因为&#xff1a;Action中Service方法结束之前&#xff0c;session已经关闭了转载于:https:/…

160 - 52 egis.1

环境&#xff1a;windows xp 工具&#xff1a; 1、OllyDBG 2、exeinfo 3、IDA 0x00 查壳 加了UPX壳&#xff0c;那么就要脱壳了。可以使用单步法来脱壳。 UPX壳还是比较简单的&#xff0c;开头pushad&#xff0c;找个popad&#xff0c;然后就是jmp了。 然后就可以用OD来…

玩转MySQL之Linux下的简单操作(服务启动与关闭、启动与关闭、查看版本)

小弟今天记录一下在Linux系统下面的MySQL的简单使用&#xff0c;如下&#xff1a; 服务启动与关闭 启动与关闭 查看版本 环境 Linux版本&#xff1a;centeros 6.6&#xff08;下面演示&#xff09;&#xff0c;Ubuntu 12.04&#xff08;参见文章末尾红色标注字体&#xff09; M…

实验八第二题

转载于:https://www.cnblogs.com/huangsilinlana/p/3411550.html

c++ boost多线程学习(一)

本次学习相关资料如下&#xff1a; Boost C 库 第 6 章 多线程&#xff08;大部分代码的来源&#xff09; Boost程序库完全开发指南 - 深入C“准”标准库 第三版 罗剑锋著 头文件&#xff1a; #include <stdio.h> #include <string.h> #include <boost\versio…

C#中什么是泛型

所谓泛型是指将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。一种类型占位符&#xff0c;或称之为类型参数。我们知道一个方法中&#xff0c;一个变量的值可以作为参数&#xff0c;但其实这个变量的类型本身也可以作为参数。泛型允许我们在调用的时候再指定这…

敏捷自动化测试(1)—— 我们的测试为什么不够敏捷?

测试是为了保证软件的质量&#xff0c;敏捷测试关键是保证可以持续、及时的对软件质量情况进行全面的反馈。由于在敏捷开发过程中每个迭代都会增加功能、修复缺陷或重构代码&#xff0c;所以在完成当前迭代新增特性测试工作的同时&#xff0c;还要通过回归测试来保证历史功能不…

学习c++

目录 一 、 boost库&#xff1a; 1. 多线程 c boost多线程学习&#xff08;一&#xff09; 二 、数据库&#xff1a; 三、socket编程&#xff1a; c socket学习&#xff08;1.1&#xff09; c socket学习&#xff08;1.2&#xff09; c socket学习&#xff08;1.3&#x…

mysql5.6与mysql5.5不同

1.编译阶段 要明白with与without的区别&#xff0c;选项值分1和0&#xff0c;或者对应为on或off&#xff0c;代表支持与不支持&#xff1b;with的1&#xff08;on&#xff09;与without的0&#xff08;off&#xff09;是同样的&#xff0c;with的0&#xff08;off&#xff09;与…

c++ 基本排序算法学习

C实现排序算法 代码地址 vector<unsigned int> cVec; int nSize cVec.size();1 冒泡排序 算法思路&#xff1a; 每两两相邻的数值都会比较大小&#xff0c;前面比后面大的时候就交换位置&#xff0c;否则就不动。 代码&#xff1a; void BubbleSort() {//优化&#x…

ios 程序学习

马上着手开发iOS应用程序&#xff1a;五、提交应用与寻找信息 2013-01-11 15:36 佚名 apple.com 我要评论(0) 字号&#xff1a;T | T本文介绍了您已经学习完如何开发一个优秀的iOS应用之后&#xff0c;应该掌握的内容&#xff0c;包括将您的应用提交到App Store让其他人下载&am…

解决SimpleButton被移除后保持OVER状态

假设场景中有一SimpleButton叫testBtn,执行下面操作&#xff1a;1.鼠标移上testBtn&#xff0c; testBtn状态变为OVER2.移除testBtn&#xff0c;removeChild(testBtn)3.5秒后重新添加testBtn到场景此时&#xff0c;看见testBtn还是OVER状态。解决方法&#xff1a;1.记录testBtn…

c++ socket学习(1.1)

本文学习相关资料&#xff1a; C/C socket编程教程 环境&#xff1a;vs2015 源码&#xff1a;本文代码 windows 如何创建客户端与服务端通信&#xff1f; TCP&#xff1a; 服务端 在windows先告诉程序我们要使用哪个版本的winsock&#xff0c;成功调用了它才能继续下去 #…

c++ socket学习(1.2)

本文学习相关资料&#xff1a; C/C socket编程教程 环境&#xff1a;vs2015 源码&#xff1a;本文代码 windows 如何创建客户端与服务端通信&#xff1f; UDP&#xff1a; 这次就没什么客户端服务端好说了&#xff0c;UDP是没有无连接的 所以改叫接收端和发送端吧 接收端 …

js高级功能与高级需求、高级期待

http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html 简单练习题&#xff1a;http://tieba.baidu.com/p/2189347922 ---------------------- scope链 闭包 Javascript属性prototype node.js metaprogramming AMD、CMD机制 http://www.makumo.com/js-modules-amd-c…

synchronized同步锁

在多线程的情况下&#xff0c;由于同一进程的多个线程共享同一片存储空间&#xff0c;在带来方便的同时&#xff0c;也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突&#xff0c;有效避免了同一个数据对象被多个线程同时访问。由于我们可以通过 private…

c++ socket学习(1.3)

本文学习相关资料&#xff1a; C/C socket编程教程 环境&#xff1a;vs2015 源码&#xff1a;本文代码 在这里c socket学习&#xff08;1.1&#xff09;学到了怎么样建立TCP&#xff0c;然后通过TCP连接发送、接收信息。 但是都是一次性的&#xff0c;当时是接收信息后就结束…

一个一线城市的IT白领的生活成本:3万/年

自从大学毕业&#xff0c;经济独立&#xff0c;就开始全面统计各种生活开支。仔细的去统计下&#xff0c;发现开销还是挺大的。 定理&#xff1a;开销越大&#xff0c;就意味着你每个月的收入必须越高。 三族鼎立节余族: 收入-开支 > 0月光族&#xff1a;收入-开支 0透支族…