一、问题描述
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.数据类型定义
(1)Task结构体
id: 整数,用于唯一标识任务节点。
duration: 整数,表示任务的执行时间。
dependencies: 整数向量,存储任务的依赖关系,即依赖于哪些任务。
earlyStart: 整数,表示任务的最早开始时间。
earlyFinish: 整数,表示任务的最早完成时间。
lateStart: 整数,表示任务的最晚开始时间。
lateFinish: 整数,表示任务的最晚完成时间。
(2)AOE_Network类
tasks: 存储Task结构体的向量,表示整个项目的任务节点。
adjacencyList: 二维整数向量,表示任务节点之间的依赖关系,为邻接表形式。
2.构造函数
构造函数初始化adjacencyList为一个大小为10的二维向量,以适应项目中的10个任务节点。
向tasks中添加了10个任务节点,每个任务节点的依赖关系通过addTask函数中的dependencies参数指定。
构造函数还通过循环为每个任务节点添加依赖关系,即调用addDependency函数。
3.成员函数
addTask(int id, int duration, const vector<int>& dependencies):
创建一个Task结构体对象,并将其添加到tasks向量中。
参数包括任务id、执行时间和依赖关系。
addDependency(int taskId, int dependencyId):
通过修改adjacencyList来添加依赖关系。
在任务dependencyId完成后,任务taskId才能开始。
topologicalSort():
使用拓扑排序算法,计算任务节点的拓扑序列。
通过计算入度和队列进行拓扑排序,将结果存储在一个向量中。
calculateCriticalPath():
遍历拓扑序列,计算任务节点的最早开始时间和最早完成时间。
然后从后向前遍历序列,计算最晚开始时间和最晚完成时间。
最终确定关键路径上的任务和关键路径的长度。
printTasks():
打印任务节点的详细信息,包括id、执行时间和依赖关系。
main():
创建AOE_Network对象,调用printTasks打印任务信息。
调用topologicalSort计算拓扑序列,并输出。
调用calculateCriticalPath计算关键路径,并输出关键路径上的任务和长度。