数据结构-关键路径

介绍

  • 在AOV网的基础上,如果用对应边来表示活动持续时间,这种有向图被称为AOE网
  • 在AOE网中,入度为0的为源点,出度为0的为汇点,整张网看做是一件事情完成的过程,那么这两个点就是事情的开始和结束。每个活动持续的时间之和称为路径长度,从源点到汇点具有的最大长度的路径就成称为关键路径,关键路径上的活动称为关键活动。

关键路径用来计算整个活动总耗时最短的情况。假如有这样一张AOE网,在完成从1到3的过程中,每件事情需要的时间为边上的权值,那么从开头到结束,由于完成4时2,3也可以同时完成,那么需要的最短时间就是4+1=5

那么,1-4-3就是一条关键路径

不难发现,这条路径是把空余时间“塞满”的路径。假设有一件事持续时间为1h,在12点-15点都可以做,那么这件事的最早开始时间为12点,最晚开始时间为14点,这中间还有两个小时的空隙,时间没有“塞满”,那么就不会构成关键路径

所以,判断关键事件的标准就是其最早开始时间与最晚开始时间是否相等

如何求关键路径

  1. 绘制计划图,标注其持续时间
  2. 根据各活动的依赖关系,计算其最早开始时间和最晚开始时间
  3. 计算每个活动的最早完成时间和最晚完成时间(由2结果可以推导出)
  4. 找到最早开始时间与最晚开始时间相等的事件,这些活动构成了关键路径

具体实现

由于计算关键路径之前需要先理清事件的先后关系,所以在找关键路径之前需要先对网图进行拓扑排序,不同的是,我们需要在邻接表中加入代表边权值的值域。

typedef struct edge{
	int adjvex;//邻接点域,用于储存该顶点对应下标
	int info;//储存权值
	int weight;//储存边的权值
	struct edge* next;//链域,指向下一个邻接点
}edge;
typedef struct vex{
	int v;//储存顶点
	int in;//记录入度;
	edge* first;//边表头指针
}vex,adjlist[MAX];
//储存邻接链表构成的网图信息
typedef struct{
	adjlist al;
	int numE,numN;
}graphAL;

拓扑排序过程中也需要加入对时间的判断处理,并额外记录拓扑排序的结果

int et[MAX],lt[MAX];//记录最早时间和最晚时间
bool topo(graphAL g){
	int n=0;//记录输出的顶点值,判断是否为AOV网
	deque <int>q;//创建队列
	for (int i=0;i<g.numN;i++){
		if (g.al[i].in==0){//入度为0
			q.push_back(i);//入队
		}
	}
	deque <int>q2;//用于储存拓扑序列
	for (int i=0;i<g.numN;i++){
		et[i]=0;//初始化
	}
	while(!q.empty()){
		cout<<q.front()<<" ";//将入度为0的顶点输出
		n++;//输出的顶点数加1
		edge* e=g.al[q.front()].first;
		q2.push_front(q.front());//记录弹出的顶点
		int top=q.front();
		q.pop_front();//此顶点出队
		while(e){//处理其相邻顶点
			int temp=e->adjvex;//记录相邻顶点
			if (g.al[temp].in==1)//入度为1,说明去掉与原顶点相连的边后入度为0
			q.push_back(temp);
			e=e->next;//继续处理下一个相邻顶点
			if (et[top]+e->weight>et[temp]) et[temp]=et[top]+e->weight;
		}
	}
	if (n!=g.numN) return false;
	else return true;
}

关键路径的求取(队列2与最早发生时间数组需要定义在全局或者传入函数中)

void CriticaPath(graphAL g){
	int e,l;//最早和最晚发生时间
	topo(g);//首先进行拓扑排序
	int ltv[g.numN];//最晚发生时间数组
	for (int i=0;i<g.numN;i++){
		ltv[i]=et[g.numN-1];//初始化
	}
	while (q2.empty()){
		int top=q.front();//将拓扑排序好的顶点出队
		q.pop_front();
		edge* e=g.al[top].first;
		while(e){
			int temp=e->adjvex;
			//判断是否需要更新最晚发生时间
			//(活动的最晚发生时间取决于其后继活动的最晚发生时间减去活动持续时间)
			if (ltv[temp]<ltv[top]+e->weight) ltv[top]=ltv[temp]+e->weight;
			e=e->next;
		}
	}
	for (int i=0;i<g.numN;i++){
		edge* e=g.al[i].first;
		while(e){
			int temp=e->adjvex;
			e=et[i];//活动最早时间
			l=ltv[temp]-e->weight;//最晚开始时间
			if (e==l)//判断是否为关键事件
			......//如果是,进行题目要求的打印或求路径之和操作
			e=e->next;
		}
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LVS负载均衡服务器

简介: LVS (Linux Virtual Server):四层路由设备&#xff0c;是由中国人章文松研发的(阿里巴巴的副总裁)根据用户请求的IP与端口号实现将用户的请求分发至不同的主机。 工作原理: LVS工作在一台server上提供Directory(负载均衡器)的功能&#xff0c;本身并不提供服务&#xff…

安卓平板主板_安卓平板电脑主板MTK联发科|高通|紫光展锐方案

安卓平板电脑主板选择了MTK联发科方案&#xff0c;并且可以选配高通或者紫光展锐平台方案&#xff0c;为用户提供更强劲的性能和定制化的服务。主板搭载了联发科MT6771处理器&#xff0c;采用12nm制程工艺&#xff0c;拥有八核Cortex-A73Coretex-A53架构&#xff0c;主频为2.0G…

全景分屏对比模式,差异化展示更直观!

在生活中&#xff0c;对比现象无处不在&#xff0c;人们通过对比可以做出更好的判断甚至是选择。 而在家装设计行业&#xff0c;伴随着商业服务的升级&#xff0c;一些企业也在通过一些方式&#xff0c;满足客户的对比需求&#xff0c;从而提高服务质量。 全景分屏对比模式&a…

vue2 + axios + mock.js封装过程,包含mock.js获取数据时报404状态的解决记录,带图文,超详细!!!

vue axios mock.js 以下是封装的过程&#xff0c;记录一下 1、首先先了解什么是mock.js的用途及特点 官网地址&#xff1a;Mock.js (mockjs.com) 作用&#xff1a;生成随机数据&#xff0c;拦截 Ajax 请求 优势&#xff1a; 2、了解axios的原理及使用 官网地址&#xff1a…

智能手表的革命性突破:TRIZ理论引领未来穿戴技术!

在科技日新月异的今天&#xff0c;智能手表已经从单纯的计时工具转变为集健康监测、信息通讯、娱乐休闲等多功能于一体的智能穿戴设备。而基于TRIZ理论的智能手表更是在这一变革中扮演着引领者的角色。TRIZ&#xff0c;即发明问题解决理论&#xff0c;是一套系统的创新方法学&a…

opencv图像腐蚀

腐蚀&#xff08;Erosion&#xff09;是一种形态学图像处理操作&#xff0c;用于移除图像中的小白点、细小物体或者边缘。它通过将结构元素应用于图像上的像素来实现。 以下是opencv实现图像腐蚀的代码 #include <opencv2/highgui/highgui.hpp> #include <opencv2/im…

postman访问k8s api

第一种方式&#xff1a; kubectl -n kubesphere-system get sa kubesphere -oyaml apiVersion: v1 kind: ServiceAccount metadata:annotations:meta.helm.sh/release-name: ks-coremeta.helm.sh/release-namespace: kubesphere-systemcreationTimestamp: "2023-07-24T07…

Unity中字符串拼接0GC方案

本文主要分析C#字符串拼接产生GC的原因&#xff0c;以及介绍名为ZString的库&#xff0c;它可以将字符串生成的内存分配为零。 在C#中&#xff0c;字符串拼接通常有三种方式&#xff1a; 直接使用号连接&#xff1b;string.format;使用StringBuilder&#xff1b; 下面分别细…

express+mysql+vue,从零搭建一个商城管理系统4--mysql数据库链接

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、创建express_service数据库二、安装mysql三、新建config文件夹四、新建config/db.js五、index.js引入db.js文件六、启动项目预览总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写service…

高级语言期末2011级A卷(软件学院)

1.编写函数&#xff0c;判定正整数m和n&#xff08;均至少为2&#xff09;是否满足&#xff1a;数m为数n可分解的最小质因数&#xff08;数n可分解的最小质因数为整除n的最小质数&#xff09; 提示&#xff1a;判定m为质数且m是n的最小因数 #include <stdio.h> #include…

导览系统厂家|景区电子导览|手绘地图|AR导览|语音导览系统

随着元宇宙、VR、AR等新技术的快速发展&#xff0c;旅游服务也更加多元化、智能化。景区导览系统作为旅游服务的重要组成部分&#xff0c;其形式更加多元化智能化。智能导览系统作为一种新的服务方式&#xff0c;能够为游客提供更加便捷的旅游服务和游览体验&#xff0c;也逐渐…

【经验】vscode 鼠标拖曳不能选中整行文字,只能选中纵向矩形范围

1、问题描述 不知道昨天操作vscode设置界面时&#xff0c;误选择了啥&#xff0c;导致鼠标拖曳不能选中整行文字&#xff0c;只能选中纵向矩形范围&#xff0c;现象如下&#xff1a; 2、解决方法 1&#xff09;打开设置界面 点击左下角按键&#xff0c;选择“设置” 2&…

在CentOS上使用Docker搭建Halo博客并实现远程访问的详细指南

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. Docker部署Halo1.1 检查Docker版本1.2 在Docker中部署Halo 二. Linux安装Cpol…

Oracle中序列

1. Sequence 定义 在Oracle中可以用SEQUENCE生成自增字段。Sequence序列是Oracle中用于生成数字序列的对象&#xff0c;可以创建一个唯一的数字作为主键。 2. 为什么要用 Sequence 你可能有疑问为什么要使用序列&#xff1f; 不能使用一个存储主键的表并每次递增吗&#xf…

第102讲:MySQL多实例与Mycat分布式读写分离的架构实践

文章目录 1.Mycat读写分离分布式架构规划2.在两台服务器中搭建八个MySQL实例2.1.安装MySQL软件2.2.创建每个MySQL实例的数据目录并初始化2.3.准备每个实例的配置文件2.4.准备每个实例的启动脚本2.6启动每台机器的MySQL多实例2.7.为每个MySQL实例设置密码2.8.查看每个MySQL实例的…

【寸铁的刷题笔记】图论、bfs、dfs

【寸铁的刷题笔记】图论、bfs、dfs 大家好 我是寸铁&#x1f44a; 金三银四&#xff0c;图论基础结合bfs、dfs是必考的知识点✨ 快跟着寸铁刷起来&#xff01;面试顺利上岸&#x1f44b; 喜欢的小伙伴可以点点关注 &#x1f49d; &#x1f31e;详见如下专栏&#x1f31e; &…

微信小程序 获取openId - 成功获取

1.点击云开发配置里面的信息 2-基础信息配置结束之后 - 新建一个云函数 - 名字自定义但是要记住&#xff0c;这里定义为login3.保存成功之后出现这个 代表成功 - 这个弹窗可以关闭了 4.定义一个方法 name:login, 这里需要修改成对应的 是刚才上面定义的云函数名称 info()…

博途PLC 单通气缸功能块(SCL源代码)

气缸是工业现场应用非常多的一个重要执行器,气缸在很多场合都有大量应用,今天我们的对象就是"单通气缸",不同的工程师,不同的应用行业,大家对气缸功能块的封装会有所不同。气缸功能块的其它封装大家可以参看下面文章 1、气缸功能块 https://rxxw-control.blog…

mac打不开xxx软件, 因为apple 无法检查其是否包含恶意

1. 安全性与隐私下面的允许来源列表&#xff0c;有些版本中的‘任何来源’选项被隐藏了&#xff0c;有些从浏览器下载的软件需要勾选这个选项才能安装 打开‘任何来源’选项 sudo spctl --master-disable 关闭‘任何来源’选项 sudo spctl --master-enable

DVWA 靶场之 Command Injection(命令执行)原理介绍、分隔符测试、后门写入与源码分析、修复建议

在打靶之前我们需要先解决一个乱码问题 参考我之前的博客&#xff1a; 关于DVWA靶场Command Injection&#xff08;命令注入&#xff09;乱码的解决方案-CSDN博客 简单介绍一下命令执行漏洞&#xff1a; 命令执行漏洞是一种常见的网络安全漏洞&#xff0c;它允许攻击者通过向应…