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

相关文章

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编