C++实现关键路径和拓扑排序

一、问题描述

1.题目内容

创建一个AOE网完成如下要求

2.基本要求

(1)采用邻接表结构存储网(结点数量不低于10个,边的数量不低于15条)

(2)输出一个拓扑序列

(3)输出所有关键路径并计算路径长度。

二、需求分析

1.定义结点和边

确定AOE网有结点数量,每个结点表示一个活动(任务),并为每个结点分配一个唯一的标识符。

确定边的数量,每条边表示活动之间的依赖关系。为每条边确定起始结点和结束结点。

2.创建邻接表

使用邻接表的数据结构来表示AOE网。对每个结点,记录其邻接结点以及相关边的信息。

3.拓扑排序

实现拓扑排序算法,找到一个拓扑序列。拓扑排序可以通过深度优先搜索(DFS)或广度优先搜索(BFS)来完成。确保拓扑排序满足活动的先后顺序。

4.输出拓扑序列

5.关键路径分析

计算每个结点的最早开始时间(ES)和最晚开始时间(LS);计算每个活动的最早开始时间(ES)、最早结束时间(EF)、最晚开始时间(LS)和最晚结束时间(LF);计算每个活动的总浮动时间(TF = LS - ES);识别关键路径,即具有零浮动时间的路径;输出关键路径和路径长度;输出找到的关键路径,并显示路径的长度。

三、概要设计

1.数据类型定义

1Task结构体

id: 整数,用于唯一标识任务节点。

duration: 整数,表示任务的执行时间。

dependencies: 整数向量,存储任务的依赖关系,即依赖于哪些任务。

earlyStart: 整数,表示任务的最早开始时间。

earlyFinish: 整数,表示任务的最早完成时间。

lateStart: 整数,表示任务的最晚开始时间。

lateFinish: 整数,表示任务的最晚完成时间。

2AOE_Network类

tasks: 存储Task结构体的向量,表示整个项目的任务节点。

adjacencyList: 二维整数向量,表示任务节点之间的依赖关系,为邻接表形式。

2.构造函数

构造函数初始化adjacencyList为一个大小为10的二维向量,以适应项目中的10个任务节点。

向tasks中添加了10个任务节点,每个任务节点的依赖关系通过addTask函数中的dependencies参数指定。

构造函数还通过循环为每个任务节点添加依赖关系,即调用addDependency函数。

3.成员函数

addTask(int id, int duration, const vector& dependencies):

创建一个Task结构体对象,并将其添加到tasks向量中。

参数包括任务id、执行时间和依赖关系。

addDependency(int taskId, int dependencyId):

通过修改adjacencyList来添加依赖关系。

在任务dependencyId完成后,任务taskId才能开始。

topologicalSort():

使用拓扑排序算法,计算任务节点的拓扑序列。

通过计算入度和队列进行拓扑排序,将结果存储在一个向量中。

calculateCriticalPath():

遍历拓扑序列,计算任务节点的最早开始时间和最早完成时间。

然后从后向前遍历序列,计算最晚开始时间和最晚完成时间。

最终确定关键路径上的任务和关键路径的长度。

printTasks():

打印任务节点的详细信息,包括id、执行时间和依赖关系。

main():

创建AOE_Network对象,调用printTasks打印任务信息。

调用topologicalSort计算拓扑序列,并输出。

调用calculateCriticalPath计算关键路径,并输出关键路径上的任务和长度。

4.算法分析

1拓扑排序

你可能感兴趣的:(课程设计,#,算法与数据结构,c++,算法,数据结构)