c语言aoe网的关键路径,AOE网求关键路径 c++代码

2023-12-30 01:50

本文主要是介绍c语言aoe网的关键路径,AOE网求关键路径 c++代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

####题目: 给定10个结点以及结点间的权值,试着求解其任意两点间的关键路径。 ####分析: AOE网原本是存在入点和出点的,这里求“任意节点”,所以会出现不存在的情况。(虽然我觉得这部分不是很必要…)

基本步骤参考了这篇,写得非常好,一个例子远比大段文字描述来得清晰明了。

由于上面那篇文章里的例子是9个点,而题目要求的是10个点,我在v1前面加了一个v0,对结果没有什么影响。

1917b956ffd89e14ec6facb3e227aefb.png

代码如下:

/*算法:

1.输入边数m;

2.初始化权重d[i][j]为max(0<=i

3.输入每条边的起点u终点v及其权重w,设置d[u][v]=w;

4.输入要查询的两点first和last;

5.初始化的earliest[i]=0; latest[i]=max; path[i]=max(0<=i<10);

6.从k=first开始(earliest[first]=0),递归查找下一个节点i,然后计算各个点最早开始的时间earliest[i],如果earliest[k]+d[k][i]>earliest[i]则更新earliest[i];如果发现没有任何节点i与k相连,则输出“路径不存在”;

7. 从k=last开始(latest[last]=earliest[last]),递归查找上一个节点i,然后计算各个点最晚开始的时间latest[i],如果latest[k]-d[i][k]

8. 从k=first开始,循环查找下一个节点i,如果latest[i]-d[k][i]==earliest[k],则k->i为关键路径,把i加入到path中。

9.打印输出path的内容

*/

#include

using namespace std;

#define max 1000000

int d[10][10];

int earliest[10];

int latest[10];

int path[10];

void findEarliest(int k,int last);

void findLatest(int k,int first);

bool flag=false;//用于判断是否存在关键路径

int main(){

int i,j,k,m,n=10;

int u,v,w;

int first,last,count=0;

int next;

cout<

cin>>m;

for(i=0;i

for(j=0;j

d[i][j]=max;

}

cout<

for(i=0;i

cin>>u>>v>>w;

d[u][v]=w;

}

cout<

cin>>first>>last;

for(i=0;i<10;i++){

earliest[i]=0;

latest[i]=max;

path[i]=max;

}

k=first;path[0]=k;count=1;

findEarliest(k,last);

if(!flag){

cout<

return 0;

}

k=last;latest[k]=earliest[k];

findLatest(k,first);

k=first;

while(k!=last){

for(i=0;i<10;i++){

if(d[k][i]!=max&&(latest[i]-d[k][i]==earliest[k])){

path[count++]=i;

k=i;

break;

}

}

}

cout<

for(i=0;path[i]!=last;i++){

cout<";

}

cout<

}

void findEarliest(int k,int last){

if(k==last)

return;

flag=false;

for(int i=0;i<10;i++){

if(d[k][i]

flag=true;

if((earliest[k]+d[k][i])>earliest[i])

earliest[i]=earliest[k]+d[k][i];

findEarliest(i,last);

}

}

//如果flag没有在循环中被修改为ture,则说明没有节点与k相连(即没有进入if语句内,函数返回不再进行递归),然后在主函数中判断flag的值来决定是否继续

}

void findLatest(int k,int first){

if(k==first)

return;

for(int i=0;i<10;i++){

if(d[i][k]

if(latest[k]-d[i][k]

latest[i]=latest[k]-d[i][k];

findLatest(i,first);

}

}

}

####结果截图:

1234745e9036168dee10a0faa6ed9425.png

49ebee31f66576e995037de9ebb45cbf.png

####反思: 采用递归和大量循环遍历在时间上效率很低。本题只有十个点,如果数据规模较大,改成用指针查找或许比较快,但是数据结构的建立就比较麻烦了。 ####本文是个人学习记录,如有错误请指出!

这篇关于c语言aoe网的关键路径,AOE网求关键路径 c++代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/551344

相关文章

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下: