数据结构之关键路径
1、AOE网AOE网是⼀个带权的有向无环图其中顶点表示事件Event弧表示活动权表示活动持续的时间。2、源点和汇点AOE网中入度为零的点称为源点将出度为零的点称为汇点。3、关键路径完成工程的最短时间是从源点到汇点的最长路径的长度。路径长度最长的路径就叫做关键路径。ETVEarliest Time Of Vertex)事件最早发生时间就是顶点的最早发生时间。LTVLatest Time Of Vertex)事件最晚发生时间就是每个顶点对应的事件最晚需要开始的时间如果超出此时间将会延误整个工期。ETE(Earliest Time Of Edge)活动的最早开工时间就是弧的最早发⽣时间。LTE(Lastest Time of Edge)活动的最晚开工时间就是不推迟工期的最晚开工时间。4、关键路径算法关键路径Critical Path针对有向无环加权图AOE网工程活动网络是从源点入度为0到汇点出度为0的最长路径。路径上的活动称为关键活动关键路径长度决定整个工程的最短完成时间关键活动延时会直接导致整体工程延时。步骤1拓扑排序对AOE网进行拓扑排序得到有序节点序列若图存在环则无关键路径工程无法正常进行。步骤2计算最早发生时间 ve[]ve[i]节点i事件的最早发生时间从源点正向推导。公式源点 ve[start] 0遍历拓扑序列对当前节点u的所有出边 u→v权重w执行 ve[v] max(ve[v], ve[u] w)。步骤3计算最晚发生时间 vl[]vl[i]节点i事件的最晚发生时间不推迟整体工程工期从汇点逆向推导。公式汇点 vl[end] ve[end]逆序遍历拓扑序列对当前节点v的所有入边 u→v权重w执行 vl[u] min(vl[u], vl[v] - w)。步骤4筛选关键节点与关键路径若节点满足 ve[i] vl[i]该节点为关键节点由相邻关键节点组成的路径即为关键路径。#includeiostream#includevector#includequeue#includecstring#includealgorithmusingnamespacestd;constintMAXN105;constintINF0x3f3f3f3f;// 邻接表存储: to目标节点, weight边权, next下一条边structEdge{intto,w;Edge(intt,intww):to(t),w(ww){}};vectorEdgeadj[MAXN];// 正向邻接表(拓扑、求ve)vectorEdgereverseAdj[MAXN];// 逆向邻接表(求vl)intinDegree[MAXN];// 入度数组vectorinttopoSeq;// 存储拓扑排序序列intve[MAXN],vl[MAXN];// 最早、最晚发生时间// 拓扑排序booltopoSort(intn){queueintq;// 初始化入度为0的节点入队for(inti1;in;i){if(inDegree[i]0)q.push(i);}while(!q.empty()){intuq.front();q.pop();topoSeq.push_back(u);// 遍历出边更新后继节点入度for(Edge e:adj[u]){intve.to;inDegree[v]--;if(inDegree[v]0)q.push(v);}}// 拓扑序列长度不等于节点数说明有环无关键路径returntopoSeq.size()n;}// 计算关键路径voidcriticalPath(intn){// 1. 初始化ve数组正向求最早发生时间memset(ve,0,sizeof(ve));for(intu:topoSeq){for(Edge e:adj[u]){intve.to,we.w;if(ve[v]ve[u]w){ve[v]ve[u]w;}}}// 2. 初始化vl数组逆向求最晚发生时间intendNodetopoSeq.back();fill(vl,vln1,INF);vl[endNode]ve[endNode];// 逆序遍历拓扑序列for(intitopoSeq.size()-1;i0;i--){intvtopoSeq[i];for(Edge e:reverseAdj[v]){intue.to,we.w;if(vl[u]vl[v]-w){vl[u]vl[v]-w;}}}// 3. 输出关键节点和关键路径cout 关键路径计算结果 endl;cout工程最短总工期ve[endNode]endl;cout关键节点;for(inti1;in;i){if(ve[i]vl[i]){couti ;}}coutendl;cout关键活动(边)endl;for(intu1;un;u){// 筛选关键节点之间的边if(ve[u]!vl[u])continue;for(Edge e:adj[u]){intve.to,we.w;if(ve[v]vl[v]ve[v]ve[u]w){cout节点u - 节点v (工期:w)endl;}}}}intmain(){// 初始化memset(inDegree,0,sizeof(inDegree));intn,m;cout请输入节点数、边数;cinnm;// 构建正向、逆向邻接表for(inti0;im;i){intu,v,w;cout请输入第i1条边(起点 终点 权重);cinuvw;adj[u].emplace_back(v,w);reverseAdj[v].emplace_back(u,w);inDegree[v];}// 拓扑排序判环if(!topoSort(n)){cout图中存在环路无关键路径endl;return0;}// 计算并输出关键路径criticalPath(n);return0;}

相关新闻

Peter Corke机器人工具箱:重塑机器人算法开发的智能引擎

Peter Corke机器人工具箱:重塑机器人算法开发的智能引擎

Peter Corke机器人工具箱:重塑机器人算法开发的智能引擎 【免费下载链接】robotics-toolbox-matlab Robotics Toolbox for MATLAB 项目地址: https://gitcode.com/gh_mirrors/ro/robotics-toolbox-matlab 在机器人技术快速发展的今天,算法开发效率…

2026/10/21 7:24:10 阅读更多 →
终极解决方案:如何彻底修复Reloaded II游戏模组加载失败问题

终极解决方案:如何彻底修复Reloaded II游戏模组加载失败问题

终极解决方案:如何彻底修复Reloaded II游戏模组加载失败问题 【免费下载链接】Reloaded-II Universal .NET Core Powered Modding Framework for any Native Game X86, X64. 项目地址: https://gitcode.com/gh_mirrors/re/Reloaded-II 你是否在使用Reloaded …

2026/10/21 3:03:54 阅读更多 →
MySQL事务全解析

MySQL事务全解析

一、事务核心概念 事务是一组数据库操作的集合,是数据库最小逻辑执行单元。 核心特性:一组操作要么全部成功,要么全部失败回滚,不会出现 “一半成功、一半失败” 的脏数据状态。 经典业务场景:银行转账,…

2026/10/22 5:17:08 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/22 10:18:38 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/22 11:01:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/22 9:44:47 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/22 10:40:08 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/22 10:56:37 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/21 21:32:28 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:50:56 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:51:55 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 16:24:48 阅读更多 →