C 实现关键路径算法课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有向图的关键路径
计算机与软件工程学院课程设计说明书
课程名称: 数据结构与算法课程设计
课程代码:
题目:
年级/专业/班:
学生姓名:
学号:
开始时间:2016 年 5 月8 日
完成时间:2016 年5月18 日课程设计成绩:
指导教师签名:年月日
目录
引言 (1)
1需求分析 (1)
1.1任务与分析 (1)
1.2测试数据 (1)
2 概要设计 (3)
2.1设计思路 (3)
2.2层次图 (3)
3 详细设计 (4)
3.1主函数的实现 (4)
3.2数据录入实现 (5)
3.3输出图的各顶点和弧的实现 (6)
3.4计算各顶点的入度 (7)
3.5输出关键路径 (8)
4调试分析 (8)
5用户使用说明 (9)
6测试结果 (9)
6.1录入数据 (9)
6.2功能实现 (10)
6.3测试结论 (11)
致谢 (13)
参考文献 (14)
摘要
具有最大路径长度的路径称关键路径,关键路径上的活动称关键活动。
课程设计主要要求求有向图的关键路径。用领接表存储结构储存有向图。
用深度遍历的方式输出有向图的顶点和弧。程序实现了存储有向图,输出
有向图的各顶点和弧,计算顶点的入度和求有向图的关键路径这四个功能。
用领接表存储结构储存有向图,用深度遍历的方式输出有向图的顶点和弧,
用遍历查找的方式计算顶点的入度。求关键路径时先用拓扑排序函数判断
有向图是否有回路,调用求关键活动的函数找到关键路径,最后输出。
关键词:领接表;入度;AOE网;关键路径;
有向图的关键路径
引言
工程有很多的阶段,这些阶段之间有一定的先后关系和自己的时间。我们可以用图来表示工程,将其输入程序中,可以用程序计算出工程的相关信息,如,工程完成的最短时间,哪些活动会影响工程的进度等。要解决这些问题就可以用领接表储存图,并计算各个事件和各个阶段的最早发生时间和最晚发生时间,得到关键活动,从而的到关键路径。
1需求分析
从键盘上输入图的各顶点和弧上的权值,用领接表储存。在屏幕上输出图的顶点和弧。计算输出顶点的入度。如果图是AOE网,输出关键路径。
1.1任务与分析
1、首先定义边节点和顶点的结构体,将输入的数据用链接表储存起来,领接表即是顺序+链式的存储方式。将顶点顺序储存,将该顶点为起点的弧指向的另一顶点及其相关信息存储在链表中。
2、采用深度遍历的方式,输出顶点和弧。
3、判断顶点是否在弧尾,在弧尾就在入度的计数变量上加一。
4、首先要将图进行拓扑排序,看是否有回路,没有回路才能求关键路径。求AOE网的关键路径要先求到各个事件的最早发生时间和最迟发生时间,再求有向边的最早和最迟发生时间,活动的最晚发生时间和最早发生时间相减等于0时,该活动即为关键活动,再将关键活动按顺序连起来极为关键路径。
1.2测试数据
带权有向图测试数据如下:
测试数据1如图1-1:
图1-1测试图1
测试数据2
如图1-2:
图1-2 测试图2
测试数据3如图1-3:
图1-2 测试图3
2 概要设计
2.1设计思路
程序分总的来说分为四大功能模块:输入储存;输出顶点和弧;输出各顶点的入度;输出关键路径。在输出关键路径的模块中包括:拓扑排序判断是否有回路;计算各事件的最早发生时间和最晚发生时间;求活动的最晚发生时间,判断该活动是否是关键活动;输出关键路径。
首先调用输入存储模块创建图,用菜单工作的方式来实现对各个输出功能模块的调用。
输入储存:ALGraph
输出顶点和弧:void Print();
输出各顶点的入度:void indegree();
输出关键路径:void critical_path(ALGraph G);
输出关键路径模块中的子模块:
拓扑排序:void TopSort(ALGraph G);
事件的时间:void vv(ALGrapph G);
判断是否是关键活动:void keyEvent(ALGraph G);
2.2层次图
各模块间的层次如图2-1:
图2-1 各模块间的层次图
3 详细设计
3.1主函数的实现
首先输入图的顶点的个数和边的个数,程序通过输入的数来判断要创建的图的大小,调用图的构造函数,输入图的相关信息。之后,为了方便用户操作,用工作菜单的方式来实现对各个功能的调用。
void main()
{
int n,e;
int choose=1;//控制
int which;//功能选择变量
string *vname;//[MaxSize];
cout<<"请输入图的顶点数:";
cin>>n;
while(n<0||n>20)
{
cout<<"顶点个数应在-20之间!请重新输入!"< cin>>n; } cout<<"请输入图的边数:"; cin>>e; while(e<0) { cout<<"您输入的顶点个数小于零!请重新输入!"< cin>>e; }