AOE网的关键路径的计算

求关键路径,只需理解顶点(事件)和边(活动)各自的两个特征属性以及求法即可:

   Ø  先根据首结点的Ve(j)=0由前向后(正拓扑序列)计算各顶点的最早发生时间

   Ø  再根据终结点的Vl(j)等于它的Ve(j)由后向前(逆序拓扑)依次求解各顶点的最晚发生时间

   Ø  根据边的ee(i)等于它的发出顶点的Ve(j)计算各边的最早开始时间(最早开始,对应最早发生)

   Ø  根据边的ll(i)等于它的到达顶点的Vl(j)减去边的权值计算各边的最晚开始时间(最晚开始,对应最晚发生)

#include<iostream>
#include
<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<stack> #define MAX_NODE_NUM 100 using namespace std;int first[MAX_NODE_NUM]; typedef struct EDGE{int u, v, w;int nextarc;EDGE(){}EDGE(int u, int v, int w, int nextarc){this->u = u;this->v = v;this->w = w;this->nextarc = nextarc;} } edge;vector<edge> g; stack<int> s, t;//s存储入度为零的节点, t存储图的拓扑序列的顶点栈 int ve[MAX_NODE_NUM];//事件的最早发生时间, 或者 活动ai的最早发生时间 int vl[MAX_NODE_NUM];//事件的最晚发生时间 int degIn[MAX_NODE_NUM];//记录每一个节点的入度 int tag[MAX_NODE_NUM][MAX_NODE_NUM]; int n, m;//分别为图的节点的个数,和边的个数 bool topoSort(){memset(ve, 0, sizeof(ve));int cnt = 0;//记录 for(int i=1; i<=n; ++i)if(degIn[i] == 0)s.push(i);while(!s.empty()){int u = s.top();s.pop();t.push(u);++cnt;for(int e=first[u]; ~e; e=g[e].nextarc){int v = g[e].v;int w = g[e].w;if(--degIn[v] == 0) s.push(v);if(ve[u] + w > ve[v]) ve[v] = ve[u] + w;}}if(cnt < n) return false;//该有向图存在回路 return true; }bool criticalPath() {//寻找关键路径 if(!topoSort()) return false; for(int i=1; i<=n; ++i)vl[i] = ve[t.top()];while(!t.empty()){//逆序拓扑排序,计算每个节点的最晚的发生时间 int u = t.top();t.pop();for(int e=first[u]; ~e; e=g[e].nextarc){int v = g[e].v;int w = g[e].w;if(vl[v] - w < vl[u]) vl[u] = vl[v] - w;}}for(int i=1; i<=n; ++i){//输出关节点 int ee = ve[i];//活动ai的最早的发生时间 for(int e=first[i]; ~e; e=g[e].nextarc) {int v = g[e].v;int w = g[e].w;int ll = vl[v]-w;//活动ai的最晚的发生时间 ll == ee ? printf(" * ") : printf(" ");printf("%d %d %d %d %d\n", i, v, w, ee, ll);//分别为 u, v, w(这条边所对应的活动), 活动最早发生时间和最晚发生时间 }} return true; }void dfs(int u){for(int e=first[u]; ~e; e=g[e].nextarc) {int ee = ve[u];int v = g[e].v;int w = g[e].w;dfs(v);if(tag[u][v]) continue;tag[u][v] = 1;if(vl[v]-w < vl[u]) vl[u] = vl[v]-w;int ll = vl[v]-w;//活动au的最晚的发生时间 ll == ee ? printf(" * ") : printf(" ");printf("%d %d %d %d %d\n", u, v, w, ee, ll);} }bool criticalPathx() {//寻找关键路径,利用dfs可以 if(!topoSort()) return false; for(int i=1; i<=n; ++i)vl[i] = ve[t.top()];dfs(1);//默认1节点为源点 }void addEdge(int u, int v, int w){edge e(u, v, w, first[u]);first[u] = g.size();g.push_back(e); } int main(){printf("请输入图的节点的个数和边的个数:\n");scanf("%d%d", &n, &m);memset(first, -1, sizeof(first));while(m--){int u, v, w;scanf("%d %d %d", &u, &v, &w);addEdge(u, v, w);++degIn[v];}//criticalPath();/*输出结果: * 1 3 2 0 01 2 3 0 12 4 2 3 42 5 3 3 43 6 3 2 5* 3 4 4 2 2* 4 6 2 6 65 6 1 6 7*/criticalPathx();/*输出结果:3 6 3 2 5* 4 6 2 6 6* 3 4 4 2 2* 1 3 2 0 02 4 2 3 45 6 1 6 72 5 3 3 41 2 3 0 1*/return 0; }

输入数据:

6 8
1 2 3
2 5 3
5 6 1
2 4 2
4 6 2
3 4 4
1 3 2
3 6 3

 

 

转载于:https://www.cnblogs.com/hujunzheng/p/4652989.html

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

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

相关文章

(三)C语言之九条语句

今天来说一下我们以后可能用的最多的C语言语句&#xff1a;条件语句、循环语句、控制语句。理论很简单&#xff0c;注重多自己写代码才能熟练运用。 欢迎加入嵌入式学习群&#xff1a;559601187 一起愉快的玩耍啊~ &#xff08;一&#xff09;条件语句 &#xff08;1&#xff…

次优查找树的建立

查找效率最高即平均查找长度最小&#xff0c;根据前面所学知识&#xff0c;我们可以给出有序表在非等概率情况下应遵循的两个原则&#xff1a; 1、最先访问的结点应是访问概率最大的结点&#xff1b; 2、每次访问应使结点两边尚未访问的结点的被访概率之和尽可能相等。 这两…

平衡二叉树AVL插入

平衡二叉树(Balancedbinary tree)是由阿德尔森-维尔斯和兰迪斯(Adelson-Velskiiand Landis)于1962年首先提出的&#xff0c;所以又称为AVL树。 定义&#xff1a;平衡二叉树或为空树,或为如下性质的二叉排序树: &#xff08;1&#xff09;左右子树深度之差的绝对值不超过1; &…

(五)C语言之二维数组

今天的第二个内容单独拿出来讲一下&#xff0c;对于初接触C语言的人来说&#xff0c;这个知识点比较难懂&#xff0c;后面在讲指针的时候我还会提到这部分的内容&#xff0c;看不懂的同学可以看后面的内容。 指针变量可以指向一维数组中的元素&#xff0c;当然也就可以指向二维…

平衡二叉树AVL删除

平衡二叉树的插入过程: http://www.cnblogs.com/hujunzheng/p/4665451.html 对于二叉平衡树的删除采用的是二叉排序树删除的思路: 假设被删结点是*p&#xff0c;其双亲是*f&#xff0c;不失一般性&#xff0c;设*p是*f的左孩子&#xff0c;下面分三种情况讨论&#xff1a;  ⑴…

(六)C语言之函数

本篇文章分为三个部分讲解&#xff0c;分别为函数、局部变量和全局变量、c语言存储分区 &#xff08;一&#xff09;函数的定义和调用 函数&#xff1a;工程中最小的单位&#xff0c;为了实现某一功能的 函数的定义&#xff1a; 数据类型 函数名(数据类型 形参1&#xff0c;…

堆排序算法---属于选择排序

1.堆 堆实际上是一棵完全二叉树&#xff0c;其任何一非叶节点满足性质&#xff1a; Key[i]<key[2i1]&&Key[i]<key[2i2]或者Key[i]>Key[2i1]&&key>key[2i2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆…

(七)C语言之指针

c语言相比其他高级语言来说&#xff0c;更接近于对计算机硬件的操作&#xff0c;而指针的应用更是为我们对硬件的操作插上了翅膀&#xff0c;所以指针是嵌入式编程不可少的一部分&#xff0c;在一定意义上说&#xff0c;指针是c语言的精髓。 一、 什么是指针 在计算机中&#…

(八)C语言之结构

今天来说一下C语言里的结构体(struct)、共用体(l联合体)union、枚举。 &#xff08;一&#xff09;结构体&#xff1a;struct 1.1 概念 是一种自定义的数据类型结构体是构造类型的一种不同数据类型的集合地址空间连续&#xff0c;每次分配最大数据类型的宽度占用内存为所有变…

插入排序之表插入排序

1.表插入排序只是求得一个有序的链表&#xff0c;它是修改指针的值来代替移动记录&#xff0c;操作过程如下 2.但是这样只能进行顺序查找&#xff0c;不能进行随机查找&#xff0c;为了能实现有序表的折半查找&#xff0c;需要对记录进行重新排列。操作过程如下&#xff1a; 3.…

电容降压LED驱动电路

电容降压电路具有体积小、成本低、电流相对稳定等优点&#xff0c;可应用于小功率的LED驱动电路中&#xff0c;本文主要介绍了电容降压电路的基本电路 图一&#xff1a; 电容降压式简易电源的基本原理如图一所示&#xff0c;C3为降压电容器&#xff1b;D4为半波整流二极管&…

延时电路分析

延时电路经常会用到&#xff0c;RC电路是比较简单的电路。在电路设计中经常会用到将电阻和电容正极连接&#xff0c;电阻另一端接上电源&#xff0c;电容负极接地。 简单的延时电路 上面就是延时的电路图了&#xff0c;延时的时间为T-ln((VCC-Vout)/VCC)RC&#xff0c;公式中的…

恒流电路的分析(一)

在这里分析一个简单的LED恒流电路&#xff0c;软件采用Multisim进行波形采集 一、元器件 R1为80KΩ左右的金属膜电阻&#xff1b;Q选取耐压值超过350V的VPN三极管&#xff1b;D选取2V左右的稳压二极管(如1N4680)&#xff1b;C2选取10V、100UF以上的电解电容&#xff1b;R2选择…

ST-LINK USB communication error解决方法

今天在用stlink-v2下载程序时出现ST-LINK USB communication error&#xff0c;突然就出现了这个问题&#xff0c;在网上找了好多解决办法都不可以用&#xff0c;下面给出我的解决方案&#xff0c;文章末尾给出了网上的几种解决办法&#xff0c;仅供参考。 第一步&#xff1a;找…

利用STM32制作红外测温仪之硬件设计

最近受疫情的影响详细大家都在家里没事干&#xff0c;这里利用stm32最小系统做一个红外测温仪 这篇教程里我们来制作红外测温仪需要用到的硬件&#xff0c;关于PCB的工程文件&#xff0c;后文会给出。 &#xff08;一&#xff09;系统分析 由于我们的功能比较单一&#xff0c;…

如何在博客中插入背景音乐

1.首先进入网音乐官方网站&#xff1b; 2.查找自己喜欢的歌&#xff0c;看到如下界面 3.点击"生成外链播放器" 4.看到下面的html代码了吗&#xff1f;将代码进行复制。 5.进入博客园&#xff0c;点击 "管理" ->"设置"&#xff0c; 将代码复制…

常用存储器介绍

注意&#xff1a;"易失/非易失"是指存储器断电后&#xff0c;它存储的数据内容是否会丢失的特性。 &#xff08;一&#xff09;RAM和ROM 1.1 RAM RAM即随机存储器&#xff0c;它是指存储器中的数据被读入或者写入与信息所在位置无关&#xff0c;时间都是相同的 1…

TortoiseGit与github实现项目的上传

1. 下载并安装相关软件 这里主要涉及的软件包括msysgit和TortoiseGit。 msysgit的下载地址&#xff1a;http://msysgit.googlecode.com/files/Git-1.7.4-preview20110204.exe TortoiseGit的下载地址&#xff1a;http://code.google.com/p/tortoisegit/downloads/list&#xff0…

uboot启动流程分析

Uboot的启动流程分为两个阶段&#xff0c;第一阶段主要是汇编语言编写&#xff0c;第二阶段是C语言编写&#xff0c;每个阶段所做的工作不同&#xff0c;这篇文章分析的是uboot 2010版&#xff0c;以tiny4412的uboot为例。 启动过程涉及的主要文件&#xff1a; arch/arm/cpu/a…

(二)linux内核镜像制作

&#xff08;一&#xff09;目的 在进行嵌入式开发的时候&#xff0c;我们往往会先在电脑上安装交叉编译器&#xff0c;然后编译目标板上的代码&#xff0c;最后把代码下载到电路板中&#xff0c;嵌入式系统组成包括&#xff1a;BootLoaderkernelfilesystemapplication&#x…