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

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码