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

相关文章

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如