数据结构--6.2关键路径

news2024/11/20 6:16:36

AOE网:

        在一个表示工程的带权有向图中,用顶点表示事件,用有向边上的权值表示活动表示持续时间,这种有向图的边表示活动的网,我们称为AOE网(Activity On Edge Network)。

我们把AOE网中没有入边的顶点称为始点或源点,没有出边的顶点称为终点或汇点。

 

——etv(Earliest Time Of Vertex)

        事件最早发生时间,就是顶点的最早发生时间。 

——ltv (Latest Time Of Vertex)

        事件最晚发生时间,就是每个顶点对应的事件最晚需要开始的时间,如果超出此时间将会延误整个工期。 

——ete (Earliest Time Of Edge)

        活动的最早开工时间,就是弧的最早发生时间。

——lte (Latest Time Of Edge)

        活动的最晚发生时间,就是不推迟工期的最晚开工时间。

#define <stdio.h>
//边表结点声明 
typedef struct EdgeNode
{
	int adjvex;
	struct EdgeNode * next; 
}EdgeNode;

//顶点表结点声明 
typedef struct VertexNode
{
	int in;				//顶点入度 
	int data;
	EdgeNode * firstedge;
}VertexNode,AdjList[MAXVEX];

typedef struct
{
	AdjList adjList;
	int numVertexes,numEdges;
}graphAdjList , *GraphAdjList;

int *etv,*ltv;
int *stack2;			//用于存储拓扑序列的栈 
int top2;				//用于stack2的栈顶指针 

//拓扑排序算法
//若GL无回路,则输出拓扑排序序列并返回OK,否则返回ERRor 
Status TopologicalSort(GraphAdjList GL)
{
	EdgeNode *e;
	int i,k,gettop;
	int top = 0;		//用于栈指针下标索引 
	int count = 0;		//用于统计输出顶点的个数 
	int *stack;			//用于存储入度为0的顶点
	
	stack = (int *)malloc(GL->numVertexes * sizeof(int));
	
	for(i=0;i < GL->numVertexes;i++)
	{
		if(0 == GL->adjList[i].in)
		{
			stack[++top] = i; //将度为0的顶点下标入栈 
		}
	} 
	
	//初始化etv都为0
	top2 = 0;
	etv = (int *)malloc(GL->numVertexes * sizeof(int));
	for(i=0;i < GL->numVertexes * sizeof(int))
	{
		etv[i] = 0;
	} 
	stack2 = (int *)malloc(GL->numVertexes * sizeof(int));
	while(0 != top)
	{
		gettop = stack[top--];			//出栈 
		stack2[++top2] = gettop;		//保存拓扑序列顺序 
		count++;
		
		for(e = GL->adjList[gettop].firstedge;e;e=e->next)
		{
			k = e->adjvex;
			//将k号顶点邻接点的入度-1,因为他的前驱已经消除
			//接着判断-1后入度是否为0,如果为0则也入栈 
			if(!(--GL->adjList[k].in))
			{
				stack[++top] = k;
			}
			
			if((etv[gettop]+e->weight) > etv[k])
			{
				etv[k] = etv[gettop] + e->weight;
			} 
		}
	} 
	if(count <GL->numVertexes )  //如果count小于顶点数,说明存在环
	{
		return ERROR;
	 } 
	else
	{
		return OK;
	}
}

//求关键路径,GL为有向图,输出GL的各项关键活动
void CriticalPath(GraphAdjList GL)
{
	EdgeNode *e;
	int i,gettop,k,j;
	int ete,lte;
	
	TopologicalSort(GL);
	
	ltv = (int *)malloc(GL->numVertexes * sizeof(int));
	for(i=0;i<GL->numVertexes;i++)
	{
		ltv[i] = etv[GL->numVertexes-1];
	}
	
	//从汇点倒过来逐个计算ltv 
	while(0 !=top2)
	{
		gettop = stack2[top2--];	//第一个出栈是汇点 
		for(e = GL->adjList[gettop].firstedge; e ;e=e->next)
		{
			k = e->adjvex;
			if((ltv[k]- e->weight) < ltv[gettop])
			{
				ltv[gettop] = ltv[k] - e->weight;
			}
		}
	}
	
	//通过etv和ltv求ete和lte 
	for(j=0;j<GL->numVertexes;j++)
	{
		for(e = GL->adjList[j].firstedge; e; e = e->next)
		{
			k  = e->adjvex;
			ete = etv[j];
			lte = ltv[k] - e->weight;
			
			if(ete == lte)
			{
				printf("<v%d,v%d> length: %d , ",GL->adjList[j].data,GL->adjList[k].data,e->weight);
			}
		}
	}
 } 

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

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

相关文章

Nginx重写功能和反向代理

目录 一、重写功能rewrite 1.1 if指令 1.2 return 1.3 set指令 1.4 break 指令 二、反向代理 2.1动静分离 2.2 缓存功能 2.3 ip穿透 2.4 http反向代理负载均衡 一、重写功能rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c;此…

Mybatis-plus联表查询 -- mybatis-plus-join

以t_order、t_user、t_product三表联合查询为例&#xff0c;其中t_order表为主表。 0.数据源配置 在springboot项目中&#xff0c;像往常一样正常配置数据源。 1.引入依赖 首先在项目中引入引入依赖坐标&#xff0c;因为mpj中依赖较高版本mybatis-plus中的一些api&#xff0…

【C++】函数参数扩展 ② ( 占位参数 | 占位参数规则 - 必须为占位参数传入实参 | 默认参数与占位参数结合使用 )

文章目录 一、占位参数1、占位参数简介2、占位参数规则 - 必须为占位参数传入实参 二、默认参数与占位参数结合使用1、结合用法2、代码示例 - 占位参数与默认参数结合用法 博客总结 : 默认参数 : 在 声明 函数时 , 为 函数参数 定义一个默认值 ;默认参数规则 : " 默认参数…

JS数组迭代方法实操

数组迭代方法有 1. every() 2.some() 3.foreach() 4.map() 5.filter 逐一操作&#xff0c;并简要区分之。 1 every() every() 方法使用指定的函数测试数组中所有的项&#xff0c;在数组的所有项都满足该条件时&#xff0c;才返回true&#xff0c;否则返回false&#xff1b; …

基于亚马逊云科技打造的游戏AIGC专业版,创梦天地快速上线AI生图服务

生成式人工智能&#xff08;以下简称“生成式AI”&#xff09;的热潮正在全球范围内掀起新一轮的科技革命&#xff0c;释放出巨大的商业价值。各类“AI绘画神器”的涌现&#xff0c;为创意行业带来了翻天覆地的变化。 在游戏领域&#xff0c;生成式AI技术也吸引了玩家们的广泛关…

QT day5

服务器&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化对象server new QTcpServer(this); }Widget::~Widget() {delete ui…

数学建模之层次分析法

目录 1 模型概述2 模型流程2.1 建立递阶层次结构2.2 构造判断矩阵2.3 一致性检验2.4 计算权重2.4.1 算术平均法2.4.2 几何平均法2.4.3 特征值法 2.5 计算各方案的得分 3 编写代码4 模型局限性 1 模型概述 层次分析法(The analytic hierarchy process, 简称AHP)&#xff0c;是建…

9-AJAX-2综合案例

AJAX-综合案例 目录 案例-图书管理图片上传案例-网站换肤案例-个人信息设置 学习目标 今天主要就是练&#xff0c;巩固 axios 的使用 完成案例-图书管理系统&#xff08;增删改查&#xff09;经典业务掌握图片上传的思路完成案例-网站换肤并实现图片地址缓存完成案例-个人信…

Cyber RT学习笔记 --- 1.Cyber RT框架介绍

1.Cyber RT框架介绍 1.1 Cyber RT简介 Apollo Cyber是首个专为自动驾驶定制的高性能且开源的实时通信框架&#xff0c;于2019年与Apollo 3.5开放平台同期发布&#xff0c;它主要解决了自动驾驶系统的高并发、低延迟、高吞吐、任务调度等问题&#xff0c;同时还提供了多种通信…

Docker 使用

简介 Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付应用。 Docker可将应用程序和基础设施层隔离&#xff0c;并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序&#xff0c;并可以缩短从编写到部署运行代码的周期。 Docker…

Web前端开发概述

Web&#xff08;World Wide Web&#xff0c;全球广域网&#xff09;是指一种基于互联网的信息系统&#xff0c;通过超文本链接将全球各地的文档、图像、视频等资源相互关联起来&#xff0c;并通过Web浏览器进行交互浏览和访问。Web的发展使得人们可以方便地获取和共享各种类型的…

GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域&#xff1a;1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。2、数据可视化…

SpringMVC入门指南

目录 前言 一、什么是SpringMVC 二、MVC架构模式 三、SpringMVC的工作流程 四、SpringMVC核心组件 五、SpringMVC的优势 六、SpringMVC的配置与常用注解 七、SpringMvc请求处理流程、 控制器的编写 、视图的渲染 1.请求处理流程&#xff1a; 2.控制器的编写&#xff1…

Gin学习记录2——路由

路由 一. 常规路由二. 动态路由三. 带参数的路由3.1 GET3.2 POST3.3 绑定 四. 简单的路由组五. 文件分组 一. 常规路由 package mainimport ("net/http""github.com/gin-gonic/gin" )func index(ctx *gin.Context) {ctx.String(http.StatusOK, "Hell…

模板和STL简介

模板和STL简介 一、泛型编程1、通用交换函数的实现&#xff08;1&#xff09;代码&#xff08;2&#xff09;总结 2、泛型编程的概念3、模板的概念 二、函数模板1、概念2、格式3、代码4、原理 三、函数模板实例化1、概念2、隐式实例化&#xff08;1&#xff09;概念&#xff08…

传输层—TCP原理详解

目录 前言 1.TCP协议 2.TCP协议段格式 3.如何解包如何分用 4.网络协议栈和文件的关系 5.如何理解TCP报头 6.TCP的特点 7.TCP字段 7.1 16位窗口大小 7.2标志位 8.超时重传 9.连接管理机制 10.滑动窗口 11.拥塞控制 12.延迟应答 13.捎带应答 14.理解TCP的面向字…

【算法系列篇】分冶-快排

文章目录 前言什么是分冶1.颜色分类1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 排序数组2.1 题目要求2.2 做题思路2.3 Java代码实现 3.数组中的第k个最大元素3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 最小的k个数4.1 题目要求4.2 做题思路4.3 Java代码实现 总结 前言 …

MYSQL调优之思路----sql语句和索引调优

MySQL数据库性能优化包括综合多方面因素&#xff0c;应根据实际的业务情况制定科学、合理的调优方案进行测试调优 文章目录 MySQL性能优化1 优化介绍1.2 优化要考虑的问题2.1 优化可能带来的问题2.2 优化的需求2.3 优化由谁参与2.4 优化的方向2.5 优化的维度 1.2数据库使用优化…

【SpringMVC】工作流程及入门案例

目录 前言 回顾MVC三层架构 1. SpringMVC简介 …

虹科资讯 | LyoPro 作为领先的冻干验证解决方案获得美国和欧洲两项官方专利!

获得美国和欧洲两项官方专利 我们非常高兴地宣布&#xff0c;虹科LyoPro冻干专用温度验证仪已在美国和欧洲获得两项官方专利&#xff0c;巩固了其作为市场上同类解决方案的唯一地位。有关LyoPro温度记录仪的专利分别是 US11340015B2 和 EP3742095B1&#xff0c;前者于2022年5月…