图(3)--拓扑排序与关键路径

2023-11-04

一.拓扑排序:

         1.定义: 拓扑排序可以理解为在有向图无环图AOV-网(Activity On Vertex :用图的顶点表示活动,用弧表示活动之间的优先级)中排成一个具有前后次序的线性序列。

         2.实现方式:

                     1). 输入AOV网络。令 n 为顶点个数。
                     2). 在AOV网络中选一个没有直接前驱的顶点, 并输出之; 
                     3). 从图中删去该顶点, 同时删去所有它发出的有向边;
                     4). 重复以上 2、3 步, 直到:
                              全部顶点均已输出,拓扑有序序列形成,拓扑排序完成

                              或者,图中还有未输出的顶点,但已跳出处理循环。这说明图中还剩下一些顶点,它们都有直接前驱,再也找不到没有前驱的顶点了。这时AOV网络中必定存                                 在有向环。

         3.算法实现:                      

Status Topological Sort(ALGraph G)
{
	       //采用邻接表存储结构。若G无回路,则输出拓扑序列并返回OK,否则ERROR
	        FindInDegree(G,indegree); //对各顶点求入度indegree[0..vernum-1]
		InitStack(S);  //建零入度顶点栈
		for(i=0;i<G.vexnum; ++i)  
		   if(!indegree[i])  Push(S,i); //入度为0者进栈
	        count=0; //对输出顶点计数
		while (!StackEmpty(S)) 
		{ 
                  Pop(S,i);       
		  printf(i,G.vertices[i].data);  
		  ++count;  //输出i号顶点并计数        
	 	  for(p=G.vertices[i].firstarc; p; p=p->nextarc)
		     {          
			   k=p—>adivex;//对i号顶点的每个邻接点入度减1           
			   if(!(--indegree[k]))  Push(S,k);   //若入度减为0,则入栈    
	              }//for   
		}//while   
		if(count<G.vexnum) return ERROR;//该有向图有回路  
		else return OK;
}//TopologicalSort 

二.关键路径(操作带权的有向AOE-网(Activity on Adge:用边表示活动,边上的权值表示活动持续的时间,顶点表示事件,事件表示在它之前的活动全都完成了)):

              1.关键路径:完成工程最短的时间是从开始点(原点)到结束点(汇点)的最长路径长度,路径最长的路径叫做关键路径。

                        

               从v1到v9的最长路径是(v1,v2,v5,v8,v9),路径长度是18,故(v1,v2,v5,v8,v9)是一条关键路径

               2.关键活动:l(i)=e(i),即最早开始时间和最晚开始时间相等的活动,关键路径上的所有活动都是关键活动,因此提前完成非关键活动并不能提高工程的进度

                        例如:a6的最早开始时间e(a6)=5,最晚开始时间为l(a6)=8,意味着a6推迟3天完成也不会影响工程的进度,所以分析哪些是关键活动将有利于缩短整个工期。

                        推理怎样求关键活动,即找l(i)=e(i)的活动:

                               设活动ai由弧<j,k>表示,其持续时间为dut(<j,k>),故有:

                                      e(i)=ve(j)             (ve(j)表示顶点事件j的最早开始时间)

                                       l(i)=vl(k)-dut(<j,k>)    (vl(k)表示顶点事件k的最晚开始时间) 

                         现在就要求ve(j)和vl(j),分两步进行:

                                      (1)从ve(0)=0向前递推:ve(j)=Max{ve(i)+dut(<i,j>)}      <i,j>属于T(所有以第j个顶点为头的弧的集合)

                                      (2)从vl(n-1)=ve(n-1) 向后递推:vl(i)=Min{vl(j)-dut(<i,j>)}      <i,j>属于S(所有以第i个顶点为尾的弧的集合)

                        于是我们可以得到求关键活动的思想如下:

                                   1)输入e条弧(i,j),建立AOE网的存储结构。
                                   2)从源点v0出发,令ve[0]=0按拓扑有序求其余各顶点的最早发生时ve[i](1≤i≤ n-1)。如果得到的拓扑有序序列中顶点个数小于网中顶点数n,则说明网中                                      存在环,不能求关键路径,算法终止;否则执行步骤(3)。
                                   3 )从汇点vn出发,令vl[n-1]= ve[n-1],按逆拓扑有序求其余各顶点的最迟发生时间vl[i] (n-2 ≥i≥ 2);
                                   4)根据各顶点的ve和vl值,求每条弧s的最早开始时间e(s)和最迟开始时间l(s)。若某条弧满足条件e(s)=l(s),则为关键活动。                  

                3.利用上述思想解题:

                              

                   通过已经求得的各个顶点的ve(i)和vl(i)来求活动的e(i)和l()

                       

                       由于关键活动为e(i)=l(i),所以可得a1,a4,a7,a8,a10,a11为关键活动,相应的V1->V2->V5->V7->V9和V1->V2->V5->V8->V9为关键路径

               4.总结求关键路径的方法:

                       第一步(求每个顶点事件的最早开始时间): ve(源点) = 0 ;
                                                                                                   ve(j) = Max{ ve(i) + dut(<i, j>)}

                        第二步(求每个顶点的最晚开始时间):        vl(汇点) = ve(汇点);
                                                                                                   vl(i) = Min { vl(j) – dut(<i, j>)}

                         第三步(求每个活动的最早开始时间和最晚开始时间): e(s)= ve(i)
                                                                                                                         l(s)= vl(j) - dut(<i, j>)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图(3)--拓扑排序与关键路径 的相关文章

  • FPGA时序约束分享03_input delay约束

    第一章 FPGA时序约束分享03 input delay约束 作者 潘文明 本文章探讨一下FPGA的时序input delay约束 本文章内容 来源于配置的明德扬时序约束专题课视频 FPGA时序约束分享01 约束四大步骤 概括性地介绍 了时
  • 【火炉炼AI】机器学习040-NLP性别判断分类器

    火炉炼AI 机器学习040 NLP性别判断分类器 本文所使用的Python库和版本号 Python 3 6 Numpy 1 14 scikit learn 0 19 matplotlib 2 2 NLTK 3 3 本文的目标是构建一个分类器

随机推荐

  • C++1949到2022的闰年

    include
  • 2012年CSDN高校俱乐部秋季巡讲结案报告

    2012年CSDN高校俱乐部巡讲已经结束 并且得到了来自各地专家的支持 在此对他们深表谢意 同时欢迎更多的讲师加入巡讲 参与到我们的大学生公益组织中 为大学生提供技术知识和人生经验 以下是2012年高校俱乐部秋季巡讲结案报告 巡讲数据及过程
  • SystemVerilog and Verilog X Optimism – Hardware-like X Propagation with Xprop

    原文链接 http www verilogpro com x propagation with vcs xprop August 30 2015 by Jason Yu In part 2 of this series SystemVeri
  • jquery 对象不支持此属性或方法

    本来调用 和jQuery没问题 控制台也可以打印出 和jQuery 但是调用了document write后 出错 对象不支持此属性或方法 控制台也打印不出 了 报同样的错 原因 document write把整个网页重写了 当然就消失了
  • 鸿蒙系统包括8x吗,华为荣耀8X可以升级鸿蒙系统吗?

    开发者大会上 余总表示会逐步在各种设备上部署鸿蒙包括pc 那么目前有没有具体的时间 EMUI 发展到EMUI10 0这一代的时候 基本上跟安卓没了关系 唯一算的上跟安卓有关的就是安卓的内核 除了安卓这个内核 其他的东西全是华为自己的 编译器
  • 计算a+b多组

    计算a b 很多的题目测试数据会有很多组的 一般我们的在线系统没写具体要求的时候 输入是以EOF为结束的 这题的基本框架如下 int main int a b while scanf d d a b EOF 特别注意这行的写法 求和 输出
  • 移动端调试工具vConsole

    安利一款好用的移动端调试工具vConsole vConsole 是腾讯推出的一个轻量 可拓展 针对手机网页的前端开发者调试面板 官网 https alloyteam github io AlloyLever 特性 查看 console 日志
  • 安装虚拟机提示未启动服务器,Hyper-V虚拟机未启动,并触发0x80070057错误

    Hyper V虚拟机未启动 并触发0x80070057错误 09 17 2020 本文内容 本文提供了一个解决方案0x80070057尝试启动虚拟机时发生的错误 适用于 Windows Server 2012R2 原始 KB 编号 3084
  • VSCode 与 WebStorm 横向对比

    https segmentfault com a 1190000020244810
  • Outlook定时/延时发送邮件

    打开邮件撰写界面 需要进入邮件全屏界面 点开Option 选择Delay Delivery 设置需要发送的时间点 该时间与系统时间一致 最后一定要点击发送 使邮件进入待发送箱 否则就delay了一个寂寞 将会在待发送列表里看到这封邮件 以上
  • scp或者ssh报错“no matching host key type found. Their offer: ssh-rsa,ssh-dss“

    scp或者ssh报错 no matching host key type found Their offer ssh rsa ssh dss 原因 OpenSSH 7 0以后的版本不再支持ssh dss DSA 算法 查看ssh版本 ssh
  • 2022年CCCC天梯赛题解

    L1 1今天我要赢 原题链接 代码 include
  • Java中计时函数

    Java计时函数currentTimeMills System currentTimeMills 计时精确到毫秒级 跟计算机以1970年1月1日0时为计时起点一样 该函数方法统计的也是从1970年1月1日0时开始 到程序运行到该函数时刻的毫
  • Parameter 1 of constructor in xxx required a bean of type xxx‘ that could not be found.已经解决

    使用Mybatis Plus 时遇到问题Parameter 1 of constructor in xxx required a bean of type xxx that could not be found 已经解决 错误截图 错误原因
  • FPGA图像处理系列——乒乓球追踪设计实例

    注 本博文将讲解一个FPGA设计图像处理系统实例 此实例的功能为高速追踪乒乓球 读者可以参考本博文的算法思路 工程框架 但博主并不提供工程 当前 实用的图像处理系统都要求高速处理 目前广泛采用软件进行处理 但软件处理存在速度 成本的问题 近
  • MFC中CListCtrl改变选中行(选中列)的颜色实现选中高亮的效果

    在项目中遇到了这样的需求 需要对选中行进行高亮 查了一下相关的资料 记录一下自己采用的方法 先在List控件所在类中 这里是CListshow 继承于CListCtrl 添加两个变量SelectRow和SelectCol 用于保存鼠标点击的
  • QEMU虚拟机中如何安装Virtio驱动

    在计算机虚拟化中 Virtio是一种半虚拟化解决方案 即需要对Guest OS进行一定的修改 安装相应的驱动程序 能够对虚拟机的I O性能进行大幅的提升 在QEMU KVM的环境中 Virtio的后端驱动由QEMU程序提供 不需要额外的安装
  • 不要把领导当成客户

    以客户为中心的思想 几乎在所有公司都会被提及和执行 他的终极目标是和客户达成共赢 但是 并不是所有人都理解了以客户为中心 我今天想说的是来源于我们的一次工作讨论 几位新同事在分享服务案例的时候 提到自己的客户 经常把经理当成客户 他们是这样
  • python3 numpy安装 linux_Centos7安装python3、numpy、scipy、matplotlib、pandas等

    centos 7 已经自带 python 2 7 15 这里需要安装 python 3 root pwm python Python 2 7 15 Anaconda Inc default Dec 14 2018 19 04 19 GCC
  • 图(3)--拓扑排序与关键路径

    一 拓扑排序 1 定义 拓扑排序可以理解为在有向图无环图AOV 网 Activity On Vertex 用图的顶点表示活动 用弧表示活动之间的优先级 中排成一个具有前后次序的线性序列 2 实现方式 1 输入AOV网络 令 n 为顶点个数