【数据结构】图论——AOV和AOE(拓扑排序、存放表达式、关键活动、关键路径)

目录

  • AOV和AOE
    • AOV 有向无环图及其应用(拓扑结构)
      • 有向无环图的应用——存放表达式
        • 二叉树存放表达式
        • 图存放表达式
    • AOE 有向无环图及其应用——关键路径
      • 1. 事件的最早发生时间
          • 事件(顶点)最早发生时间的计算方法:
      • 2. 事件允许的最晚发生时间
          • 事件(顶点)允许的最晚发生时间的计算方法:
      • 3. 活动最早发生时间
      • 4. 活动允许的最晚开始时间

AOV和AOE

AOV 有向无环图及其应用(拓扑结构)

AOV网——用顶点表示活动,用表示活动间优先关系有向图称为顶点表示活动的网(Activity On Vertex network),简称AOV网

AOV网中不允许有回路,这意味着某项活动以自己为先决条件
拓扑排序——把AOV网络中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程

检测AOV网中是否存在环方法:对有向图构造其顶点拓扑有序序列,若网中所有顶点它的拓扑有序序列中,则该AOV网必定不存在环

拓扑排序算法

  1. 选一个入度为0的顶点,输出;
  2. 删除该顶点以及由它出发的所有边
  3. 重复步骤1、2,直到全部顶点输出或不再存在入度为0的顶点;
  4. 若图中还有剩余顶点未被删除,说明图中有回路,不是一个AOV网

AOV网的拓扑序列不唯一

拓扑排序能够检测图中是否有环存在

图采用邻接表存放;计算所有顶点的入度,存放于一维数组中;


// 结构体
#define MAXSIZE 100
typedef struct ArcNode{
	int vex;
	struct ArcNode* link;
} ArcNode; //弧

typedef struct VNode{ 
	VertexType data;//顶点信息的数据类型  
	int id; //顶点的入度
	ArcNode* firstarc;
}VNode; //顶点  顶点信息数组

typedef struct {
	VNode arc[MAXSIZE];
	int vexnum,arcnum;
	//有向图
}Graphs;

算法:

int topsort(Graphs T){ 
//图 T
	int q[MAXSIZE], count, h=t=0;//队列指针初始化
	//q为队列  用数组 顺序队列
	ArcNode * p; // 弧
	int u,v;
	
	//1.计算所有顶点入度,将入度为0 的顶点放入队列; count=0;
	
	for(v=0;v<T.vexnum;v++) //遍历所有顶点
		T.arcs[v].id=0;//初始化
		
	for (v=0;v<T.vexnum;v++) 
		for(p=T.arc[v].firstarc; p!=Null; p=p->link){
			
			u=p->vex;        //节点的信息存放的位置
			T. arc[u].id++;  //计算每个节点的入度
		}
		
		
	for (v=0;v<T.vexnum;v++)// 将入度为零的节点 入队
		if (T. arc[v].id==0) 
		
			q[t++]=v;//自己加判断队列是否会溢出!

//开始拓扑排序
	while (h!=t ){ 	//队列是否为空
		v=q[h++]; //位置信息出队
		printf(%d”,v);//打印该位置信息的节点 v是位置信息 此处打印的是位置
		count++;	//计数
		
		for(p=T.arc[v].firstarc; p!=Null;p=p->link){ 
		//循环读取的是v节点 出度的所有节点
			u=p->vex;
			T. arc[u].id--;
			
			if (T. arc[u].id==0) 
				q[t++]=u;//加判断队列是否会溢出!
			}//每读取一个 就入队下一个

	}
	
	//
	if (count<T.vexnum){//如果有节点没有被遍历到过 说明该图不是 联通图
		printf(“There is a cycle”);
		return 0;
	}
	else 
		return 1;
				
}

//总的时间复杂度为o(n+e)

在这里插入图片描述

有向无环图的应用——存放表达式

中缀表达式即运算符在操作数之间的表达式,常见表达式均为中缀表达式
后缀表达式也叫逆波兰式
前缀表达式也叫波兰式

二叉树存放表达式

二叉树存放表达式 :

波兰式: +*dj/e+hi
中缀表示: d*j+e/(h+i)
逆波兰式: dj*ehi+/+

在这里插入图片描述

在这里插入图片描述

图存放表达式

图存放表达式可以优化公共子表达式,实现公共子表达式共享
特点:只有一个入度为0的顶点

在这里插入图片描述

//构造逆波兰式的算法

Void s1(Graphs G){
	int id[MAXSIZE];
	for(v=0;v<G.vexnum;v++) 
		id[v]=0; 
		for (v=0;v<G.vexnum;v++)
			for(p= G.arc[v].firstarc; p; p=p->link){
				u=p->vex;
				id[u]++;
			} 
			for (v=0;v<G.vexnum;v++)
				if(id[v]==0)
					nibolan(G,v);
}

void nibolan(Graphs G,int v){
	//从顶点v出发构造逆波兰式
	if(G.arc[v].firstarc==NULL)
		printf("%c",G.arc[v].data);
		
	else {
	
		p=G.arc[v].firstarc; 
		w=p->vex; 
		nibolan(G,w);
		
		p=p->link;
		w=p->vex;
		nibolan(G,w);
		
		printf("%c",G.arc[v].data);
	}
}
//??

AOE 有向无环图及其应用——关键路径

AOE网:表示工程计划的有向图,其中,顶点表示事件,弧表示活动,弧上的权值表示完成一项活动需要的时间

AOE网中的某些活动可以并行进行,完成工程的最短时间是从开始顶点到完成顶点的最长路径长度路径长度最长的路径为关键路径关键路径所有活动都叫做关键活动

求解关键路径关键活动通过事件的最早、最迟发生时间、活动的最早、最迟发生时间完成。

只有在某顶点代表的事件发生后,从该顶点发出去的代表的各项活动才能开始
只有进入某顶点的各条弧代表的活动都已经结束,该顶点所代表的事件才能发生 (*)

1. 事件的最早发生时间

使用一维数组ve[]来保存每一事件的最早发生时间。

事件 v i v_i vi的最早发生时间ve[i]是从开始顶点 v 1 v_1 v1到顶点 v i v_i vi最长路径长度
在这里插入图片描述

事件(顶点)最早发生时间的计算方法:

从开始顶点 v 1 v_1 v1出发,令ve[1]=0,按拓扑有序其余各顶点的最早发生时间ve[k](2≤k≤n)

ve[k] = max{ve[j]+dut(<j,k>): <j,k>∈S},dut(<j,k>)表示活动<j,k>的所需的时间,其中S是以顶点v_k为弧头的所有弧的集合。

2. 事件允许的最晚发生时间

一维数组vl []保存每一事件允许的最晚发生时间

事件 v i v_i vi允许的最晚发生时间vl[i]是在保证完成顶点 v n v_n vnve[n]时刻发生的前提下,事件 v i v_i vi允许发生的最晚时间,它等于ve[n]减去 v i v_i vi v n v_n vn最长路径长度。
在这里插入图片描述

事件(顶点)允许的最晚发生时间的计算方法:

从完成顶点 v n v_n vn出发,令vl[n]=ve[n],按逆拓扑有序求其余各顶点的允许的最晚发生时间vl[i] (n-1≥i≥1)
vl[i]=min{vl[k]-dut(<i,k>): <i,k>∈S}其中S是以顶点vi为弧尾的所有弧的集合。

3. 活动最早发生时间

■ 一维数组e []保存每一活动的最早发生时间
■ 设活动 a i a_i ai用弧 < v j , v k > <v_j,v_k> <vj,vk>表示,与 a i a_i ai相联系的权值 dut(<j,k>)用表示,则 a i a_i ai的可能的最早开始时间e[i]等于事件 v j v_j vj可能的最早发生时间ve[j]

4. 活动允许的最晚开始时间

设活动 a i a_i ai用弧 < v j , v k > <v_j,v_k> <vj,vk>表示,与 a i a_i ai相联系的权值dut(<j,k>)用表示,则活动 a i a_i ai允许的最晚开始时间l[i]等于事件 v k v_k vk允许的最晚发生时间vl[k]-dut(<j,k>)

在这里插入图片描述

(1)关键路径上所有的活动都是关键活动。因此提前完成非关键活动并不能加快工程的速度。
(2)网络中的关键路径并不唯一,对于有几条关键路径的网来说,仅仅提高某一条关键路径上关键活动的速度,是不能缩短整个工程工期的,而必须同时提高几条关键路径上关键活动的速度。
所以,并不是网中任何一个关键活动的提前完成,整个工程都能提前完成。

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

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

相关文章

JS百题斩~ typeof 、instanceof 与 Object.prototype.toString 区别(简单易懂)

首先&#xff0c;让我们先了解一下JavaScript的数据类型&#xff0c;分为两类&#xff1a; 基础类型&#xff1a;Undefined&#xff0c;Null&#xff0c;Boolean&#xff0c;Number&#xff0c;BigInt&#xff0c;String&#xff0c;Symbol 引用类型&#xff1a;Object&#xf…

网络简史-基于图论的网络

先看一幅图&#xff1a; 如图&#xff0c;我们对类似 crossbar&#xff0c;banyan tree&#xff0c;b-tree&#xff0c;10-tree&#xff0c;256-tree&#xff0c;甚至 dcn fat-tree 等 “规则拓扑” 网络相当熟悉。规则拓扑网络中&#xff0c;地址信息被编码到拓扑本身&#…

每天复习一点小CTF知识(6.4)

NSSCTF/[FSCTF 2023]夜深人静的时候也会偷偷emo 直接爆破压缩包&#xff0c;先来数字 解压好&#xff0c;一个flag.mp3 mp3隐写&#xff0c;直接干 得一个txt文件直接开

2024最新破解版CorelDRAW解锁设计新境界!

在当今快速变化的市场环境中&#xff0c;品牌之间的竞争愈发激烈。为了在众多品牌中脱颖而出&#xff0c;企业需要不断地提升自身的品牌形象和市场识别度。而在这个过程中&#xff0c;视觉设计起到了至关重要的作用。一款优秀的设计软件不仅能帮助设计师轻松地将创意想法变成现…

【全网唯一】触摸精灵iOS版纯离线本地文字识别插件

目的 触摸精灵iOS是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。但触摸精灵的图色功能比较单一&#xff0c;无法识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要…

《平渊》· 捌 —— 「庄子」山木篇中的 “空船效应”

《平渊》 捌 "若能虚己以游世&#xff0c;其孰能害之&#xff1f;" "方舟而济于河&#xff0c;有虚船来触舟&#xff0c;虽有惼心之人而不怒&#xff1b;有一人子其上&#xff0c;则呼张歙之&#xff1b;一呼而不闻&#xff0c;再呼而不闻&#xff0c;于是三呼邪…

热烈祝贺2024年重庆市建筑电气学术年会圆满成功

芳菲四月花似锦,正是人间好时节&#xff0c;4月26日&#xff0c; 24年重庆市建筑电气学术年会在重庆维景国际大酒店举办。会议主题是“智慧 低碳 绿色 安全 ”。会上业内专家就建筑电气行业的新技术、市场趋势和未来发展展开探讨与深入交流。 本次会议邀请重庆市建筑电气行业主…

vue中实现一个时间选择器的级联框,第一层小时,第二层分钟

最近在做一个考勤系统时&#xff0c;新增班次的时候需要设置打卡时段&#xff0c;类似如下效果&#xff1a; 1、封装自定义组件Time.vue 接收参数有endHour(范围结束的小时数)、endMinute(最后一小时结束的分钟数)等&#xff0c;根据具体需求变动 <template><div&…

【代码+详解】算法题 : 最大公约数

❗❗❗必看: 下列题我全部都使用 Java 语言写的,并且均可以提交成功,获得Accepted 结果的. 如果代码和详解看了之后,对答案有任何疑问,都可以在评论区提出来,我都会一个一个回答. ❗❗❗感谢大家的支持,如果喜欢我的博客,关注 点赞 收藏 评论一波,非常感谢!!! 文章目录 题目&…

低代码和零代码软件时代质量管理(QM)和质量管理系统(QMS)

【前言】 质量控制过程的目的是为了确保产品的制造标准得到保持和改进。质量控制过程使公司能够满足客户的期望&#xff0c;同时确保产品质量的一致水平。采用这些标准创造了一种公司文化&#xff0c;鼓励所有员工努力实现高质量的生产标准。低代码和零代码软件可以成为质量控…

6.4学习总结

Codeforces Round 950 (Div. 3)A、B题解 解题思路 开一个数组来记录A,B,C,D,E,F,G难度题目出现的次数&#xff0c;因为每一轮比赛都需要每一种难度都有一题&#xff0c;所以我们只要根据要出的比赛的轮数对每一个难度的题目进行自减&#xff0c;最后遍历数组把所有为负数的题目…

vscode编译文件夹下所有文件的配置(包含插件和 .json 文件)

文章目录 我所使用的插件.json 文件配置1. c_cpp_properties.json2. launch.json3. settings.json4. tasks.json 如何运行 我所使用的插件 红框中的五个插件是必备的&#xff0c;其中 Code Runner 插件可以在写完一个 .c 或 .cpp 文件后&#xff0c;按下 Crtl R 快捷键快速编…

12-学生们参加各科测试的次数(高频 SQL 50 题基础版)

12-学生们参加各科测试的次数 -- 学生表中&#xff0c;id是唯一的&#xff0c;将他作为主表 -- CROSS JOIN产生了一个结果集&#xff0c;该结果集是两个关联表的行的乘积 -- 2行表,与3行表使用cross join,得到2*36行数据 select st.student_id, st.student_name,su.subject_na…

zdppy_api 中间件请求原理详解

单个中间件的逻辑 整体执行流程&#xff1a; 1、客户端发起请求2、中间件拦截请求&#xff0c;在请求开始之前执行业务逻辑3、API服务接收到中间件处理之后的请求&#xff0c;和数据库交互&#xff0c;请求数据4、数据库返回数据5、API处理数据库的数据&#xff0c;然后给客户…

计算机基础(3)——计算机系统组成

&#x1f497;计算机基础系列文章&#x1f497; &#x1f449;&#x1f340;计算机基础&#xff08;1&#xff09;——计算机的发展史&#x1f340;&#x1f449;&#x1f340;计算机基础&#xff08;2&#xff09;——冯诺依曼体系结构&#x1f340;&#x1f449;&#x1f34…

透视亚马逊云科技中国峰会:生成式AI全面提速,加速行业应用落地

导读&#xff1a;亚马逊云科技在中国&#xff0c;生成式AI与行业化战略齐头并进。 “亚马逊云科技致力于成为企业构建和应用生成式AI的首选。” 近日2024亚马逊云科技中国峰会上&#xff0c;亚马逊全球副总裁、亚马逊云科技大中华区总裁储瑞松分享了亚马逊云科技中国业务最新进…

嵌入式Linux系统编程 — 1.4 原子操作与竞争冒险

目录 1 竞争冒险 1.1 竞争冒险由来 1.2 竞争冒险理解 2 原子操作 2.1 O_APPEND 实现原子操作 2.2 pread()和 pwrite() 2.3 O_EXCL 标志创建文件 1 竞争冒险 1.1 竞争冒险由来 Linux 是一个支持多任务和多用户同时运行的操作系统&#xff0c;它允许多个进程同时执行。…

京东笔试-校招

2022京东数据分析笔试&#xff08;0821&#xff09; 一、选择题&#xff1a;30道 1.解决数据不平衡的方法主要有&#xff08;pca&#xff1f;&#xff09; 2.等频&#xff08;等宽&#xff09;划分问题 3.参数估计&#xff1a;矩估计与极大似然估计的用法&#xff0c;问题分…

kill 不管用时,类型为C

当使用nvidia-smi时看到类型为C的进程时&#xff0c;使用 kill -9 PID&#xff0c;却不管用&#xff0c;这时需要先使用如下命令&#xff0c;找出运行的脚本对应的所有PID: ps -aux | grep train.py 接着就会把train.py对应运行的进程全部展示出来&#xff1a; 接着就是使用 …

25、DHCP FTP

DHCP 动态主机配置协议 DHCP定义&#xff1a; 服务器配置好了地址池 192.168.233.10 192.168.233.20 客户端从地址池当中随机获取一个ip地址&#xff0c;ip地址会发生变化&#xff0c;使用服务端提供的ip地址&#xff0c;时间限制&#xff0c;重启之后也会更换。 DHCP优点&a…