数据结构--6.2关键路径

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都为0top2 = 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.hqwc.cn/news/97806.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GeoServe Web 管理界面 实现远程访问

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

【owt-server】AudioSendAdapter分析

owt-server/source/core/rtc_adapter/AudioSendAdapter.cc使用其他线程运行rtprtcpmodule taskrunner分配线程:因此,对rtprtcp的使用都是加了mutex的:首先为音频发送者生成一个随机的ssrc并注册 // SSRCs of this type.std::vector<uint32_t> ssrcs_;发送还要向rtprtc…

【实践篇】Redis使用规范清单详解

Redis 使用规范清单详解 文章目录 Redis 使用规范清单详解0. 前言参考资料 1. 键值对使用规范1. Key的命名规范2. 避免使用 bigkey2.1. "bigkey"的导致的问题2.2 避免"bigkey"问题解决方法2.2 1. 数据分片2.2.2. 数据压缩 3. 使用高效序列化方法和压缩方法…

合并到pdf怎么合并?这个方法了解一下

在现代数字化时代&#xff0c;PDF(便携式文档格式)已成为最常用的文件格式之一。PDF文件的优点在于其跨平台兼容性和保持文档格式不变的能力。然而&#xff0c;在某些情况下&#xff0c;我们可能需要知道合并到pdf。无论是为了方便管理、共享或者其他目的&#xff0c;本文将介绍…

手写Mybatis:第12章-完善ORM框架,增删改查操作

文章目录 一、目标&#xff1a;完善增删改查二、设计&#xff1a;完善增删改查三、实现&#xff1a;完善增删改查3.1 工程结构3.2 完善增删改查类图3.3 扩展解析元素3.4 新增执行方法3.4.1 执行器接口添加update3.4.2 执行器抽象基类3.4.3 简单执行器 3.5 语句处理器实现3.5.1 …

无人化在线静电监控系统的组成

无人化在线静电监控系统是一种用于检测和监控静电情况的系统&#xff0c;它可以自动地实时监测各个区域的静电水平&#xff0c;并在出现异常情况时发出报警信号。静电监控报警器则是该系统中的一个重要组成部分&#xff0c;用于接收和传达报警信号。 无人化在线静电监控系统通…

华为OD机试 - 找出经过特定点的路径长度 - 深度优先搜索(Java 2022 Q4 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

css画箭头图标放标题前面,旋转,border的单个边框设置

CSS边框属性_css border dotted_小张biubiu的博客-CSDN博客 你还不知道css的旋转效果怎么实现&#xff1f;来这里看看吧_css旋转效果_我糖呢的博客-CSDN博客 .sub-title{position: relative;margin-left: 59px;& span{color: #1CDBFE;};& span::before{content: "…

Unity 安卓(Android)端AVProVideo插件播放不了视频,屏幕一闪一闪的

编辑器运行没有问题&#xff0c;但是安卓就有问题&#xff0c;在平板上运行就会报错&#xff1a; vulkan graphics API is notsupported 说不支持Vulkan图形API,解决方法&#xff1a;把Vulkan删除掉

怎么把pdf转换成高清图片?

怎么把pdf转换成高清图片&#xff1f;最近&#xff0c;我的同事遇到了一个问题&#xff0c;现在她需要将一些pdf文件转换成高清的图片&#xff0c;这件事情让让她感到非常无助&#xff0c;因为她非常着急需要将这些文件转换为图片格式&#xff0c;以便更好的在今后的工作中进行…

长胜证券:三大拐点共振 看好智能驾驶新一轮行情

摘要 【长胜证券&#xff1a;三大拐点共振 看好智能驾驭新一轮行情】长胜证券研报指出&#xff0c;全球共振&#xff0c;国内智驾商场正迎来三大拐点&#xff1a;1&#xff09;技能上&#xff0c;“BEV Transformer数据闭环”新架构2023年开端上车&#xff0c;使得不依靠高精地…

Linux代码初试__进度条

前言 在我们的日常生活中&#xff0c;进度条是十分常见的&#xff0c;比如在软件下载中&#xff0c;应用加载中等等~~~那么进度条有什么特点&#xff1f;他又如何实现。 下面我们将结合下面的图展开讲解 一、前置理论知识 1.1回车和换行的区别 在我们的日常生活中&#x…