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

news2025/1/14 0:52:34

目录

  • 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)网络中的关键路径并不唯一,对于有几条关键路径的网来说,仅仅提高某一条关键路径上关键活动的速度,是不能缩短整个工程工期的,而必须同时提高几条关键路径上关键活动的速度。
所以,并不是网中任何一个关键活动的提前完成,整个工程都能提前完成。

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

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

相关文章

CV每日论文--2024.6.7

1、Convolutional Neural Networks and Vision Transformers for Fashion MNIST Classification: A Literature Review 中文标题&#xff1a;卷积神经网络和视觉变换器在Fashion MNIST分类任务中的应用:文献综述 简介&#xff1a;本文综述了在Fashion MNIST数据集上使用卷积神…

idea鼠标滚轮滚动放大缩小字体

在idea中的【file】->【settings】菜单&#xff0c;弹出settings窗口&#xff0c;点击窗口中的【Editor】->【General】&#xff0c;在右侧窗口中&#xff0c;选中【Change font size with CtrlMouse Wheel in All editors】即可。

mmyolo

cal_map2测试有问题&#xff0c; /home/lsw/miniconda3/envs/mmyolo/lib/python3.8/site-packages/torch/functional.py:445: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ../aten/s…

力扣第十题 10.正则表达式匹配

目录 题目 解题思路 正则表达式代码 动态规划代码 官方解题 题目 解题思路 这次也给我捡到狗运了&#xff0c;反正只要一直上传&#xff0c;内存总会遥遥领先的&#xff0c;只要在你速度领先了的情况下。 这次题目还是想当的困难的。我们有两种思路&#xff0c;一种就是使…

Android AOSP定制去掉Google搜索栏

Android AOSP定制去掉Google搜索栏 1.前言&#xff1a; ​ 最近接触了Android系统定制的需求&#xff0c;感觉非常有意思&#xff0c;之前做过Launcher和串口&#xff0c;也自己安装过虚拟机&#xff0c;不过几年没用Linux系统了有点不习惯&#xff0c;Linux命令也不熟悉&…

[Elasticsearch] ES更新问题踩坑记录

drop table if exists tmp.test_create_table; create table if not exists tmp.test_create_table( id int, name string ) stored as parquet; 问题排查 查看ES数据 发现ES创建表的状态没有正常更新 yn 还是0 查看日志 查看日志, 截取部分关键信息: ReceiverControl…

kaggle竞赛实战9——模型融合

有三种方法&#xff0c; 第一种&#xff1a;均值融合&#xff0c;代码如下 data pd.read_csv(\ result/submission_randomforest.csv\ ) data[randomforest] data[target].values temp pd.read_csv(\ result/submission_lightgbm.csv\ ) …

独立游戏之路 -- 看看你是否适合做独立游戏?

独立游戏系列文章介绍 -- 分析你是否适合做独立游戏&#xff1f; 前言一&#xff0c;专栏介绍1.1 订阅须知1.2 关于作者1.3 文章累积 二&#xff0c; 为什么要做独立游戏&#xff1f;2.1 明确目标2.2 几个能力 三&#xff0c;你能独立到什么程度&#xff1f;3.1 设计3.2 美术3.…

IP纯净度对跨境电商有影响吗?

当我们谈论代理IP时&#xff0c;通常会提到一个重要概念&#xff0c;那就是“IP纯净度”。 IP纯净度是指代理IP服务中所提供的IP地址的质量、干净程度和安全性&#xff0c;纯净度高的IP地址通常具备低恶意软件攻击的风险、良好的访问效果、稳定性和速度以及隐私保护等特点。在…

牛客题目线段树

主要是操作三&#xff0c;怎么计算 那么只需要维护区间和和区间平方和即可&#xff0c;1/2用逆元 多个标记注意标记之间有没有影响&#xff0c;mod其实很简单的&#xff0c;但是我标记没处理好一直wa,mod乱搞一下&#xff0c;我mod很丑 #include<iostream> #include<…

根据阿里文档编写【springAI+通义千问】出现的 “Can not find api-key” 异常

昨天晚上照着阿里的文档开始了我的首次【springAI 通义千问】之旅&#xff0c;不料刚开始就被狠狠地搞了一下&#xff0c;主要原因是文档有误导致程序无法按着预期运行。 按着文档一步步配置好以后&#xff0c;启动后报错信息如下&#xff1a; 照着文档&#xff08;如下图&a…

脉动圆形加载动画

效果图: 完整代码: <!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>脉动圆形加载动画</title><style type="text/css">body {background: #ECF0F1;display: flex;justify-content: center;al…

AI大模型:未来5~10年的技术革命与机遇

引言 在当今科技飞速发展的时代&#xff0c;AI大模型无疑成为了一个热门话题。它不仅仅是一个技术名词&#xff0c;更是未来5&#xff5e;10年内不可避免的技术革命。AI大模型以其强大的数据处理能力、深度学习能力以及广泛的应用前景&#xff0c;正在改变我们的生活和工作方式…

人大京仓数据库关闭大小写敏感

人大京仓数据库关闭大小写敏感 1、先删除data&#xff08;Kingbase\ES\V8\&#xff09;文件夹下的所有文件夹 2、接着找到initdb.exe所在位置&#xff0c;我的位置是在这里D:\Kingbase\ES\V8\Server\bin&#xff0c;然后输入cmd,运行一下 initdb -E UTF-8 -D C:\Kingbase\ES…

秋招突击——6/10——复习{(树形DP)树的最长路径、}——新作{电话号码的字母组合}

文章目录 引言复习树形DP——树的最长路径思路分析参考思路求图的最长的直径的通用方法证明 树形DP分析方法问题 参考代码使用一维数组模拟邻接表存储树形结构或者稀疏图 新作电话号码的组合思路分析参考实现 总结 引言 中间面试了两天&#xff0c;去上海呆了一天&#xff0c;…

1992-2012年美国西海岸的海面高度异常数据集

Gridded Altimeter Fields with Enhanced Coastal Coverage 具有增强海岸覆盖范围的网格化测高场 简介 具有增强的海岸覆盖范围的网格化高度计场数据产品包含美国西海岸的海面高度异常&#xff08;SSHA 或 SLA&#xff09;以及北纬 35.25 度-48.5 度和东经 227.75 度-248.5 …

Java版商城:Spring Cloud+SpringBoot b2b2c实现多商家入驻、一件代发及免 费小程序商城搭建

1. 涉及平台 平台管理、商家端&#xff08;pc端、手机端&#xff09;、买家平台&#xff08;h5/公众号、小程序、app端&#xff08;ios/android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 spring cloud、spring boot、mybatis、redis 3. 前端框架…

PHP短链接短网址生成源码

下载地址&#xff1a;PHP短链接短网址生成源码 V3.0(11月14日更新) 1.更换用户中心模板 2.首页可以更换模板&#xff08;暂时只有俩套&#xff09; 3.增加首页背景更换 4.logo可以在后台设置 5.更换后台模板 6.优化访问统计功能 7.删除了几个没什么用的东西 8.数据表已支持全…

ARM32开发--串口库封装(初级)

知不足而奋进望远山而前行 目录 文章目录 前言 目标 内容 开发流程 文件目录创建 分组创建 接口定义 完整代码 总结 前言 在嵌入式软件开发中&#xff0c;封装抽取流程和抽取封装策略是非常重要的技术&#xff0c;能够提高代码的复用性和可维护性。本文将介绍如何在文…

操作系统安全:Windows系统安全配置,Windows安全基线检查加固

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…