实现求关键路径算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
沈阳航空航天大学
课程设计报告
课程设计名称:数据结构课程设计
课程设计题目:实现求关键路径的算法
院(系):计算机学院
专业:计算机科学与技术
班级:04010102
学号:2008040101058
姓名:刘小靖
指导教师:许清
完成日期:2014年1月9日
目录
第一章需求分析 (1)
1.1题目内容与要求 (1)
1.2题目理解与功能分析 (1)
第二章概要设计 (3)
2.1设计思路 (3)
2.2系统模块图 (3)
第三章详细设计 (4)
3.1图存储结构的建立 (4)
3.2求关键路径的算法 (5)
第四章调试分析 (7)
参考文献 (10)
附录(程序清单) (11)
第一章需求分析
1.1 题目内容与要求
内容:
自拟定合适的方式从键盘上输入一个AOE网,使用图的邻接表存储结构存储该AOE网,然后求出该AOE网的关键路径。输入AOE网的方式要尽量的简单方便,程序要能够形象方便地观察AOE网和它的关键路径
基本要求:
1.熟悉图的存储结构及操作方式;
2.熟悉求关键路径的算法;
3.熟练运用开发环境;
4.完成软件的设计与编码;
5. 熟练掌握基本的调试方法;
6. 提交符合课程设计规范的报告;
1.2 题目理解与功能分析
该题实质要求用数据结构中的图形知识编写一个求无循环有向帯权图中从起点到终点所有路径,经分析、比较求出长度最大路径,从而求出关键路径。
通常我们用有向图表示一个工程。在这种有向图中,用顶点表示活动,用有向边
网;输出关键活动并求出这个工程的关键路径;求出完成这个关键路径的最少时间并输出,该程序结束。
第二章概要设计
2.1 设计思路
基本设计思路:
(1) 以某一个求无循环有向帯权图蓝本。
(2) 观察并记录这个图中每个弧的起始点及权值。
(3) 用记录的结果建立AOE网,即边表示活动的网络,并用图的形式表示。
(4) 用领接表来存储图这些信息。
(5) 用Create( )函数建立AOE图。
(6) 用CriticPath ( )函数求出最大路径,并打印出关键路径。
(7) 编写代码并测试。
2.2 系统模块图
图2-1系统模块图
第三章详细设计
3.1 图存储结构的建立
1. 先建立邻接表的存储单元,为建立邻接表做准备。为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对于有向图是以vi 为尾的弧)。每个结点由3个域组成,其中邻接域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextedge)指示下一条边或弧的结点,权值域(W)存储边或弧的权值大小。在表头结点除了设有链域(firstedge)指向链表中第一个结点之外,还设有存储顶点v或其他有关的数据域(data)和存储顶点入度的域(id)(代码如下)。
typedef struct node {
int adjvex;
int w;
struct node *nextedge;
}edgenode;
typedef struct {
char data;
int id;
edgenode *firstedge;
}vexnode;
2. 然后构造有向图。第一,输入顶点信息存储在顶点表中,并初始化该顶点的便表。第二,首先输入边所依附的两个顶点的序号i和j然后生成新的邻接点序号为j的边表结点,最后将该结点插入到第i个表头部。(代码如下)
for(int k=0;k scanf("%d,%d,%d",&begin,&end,&duttem); p=(edgenode*)malloc(sizeof(edgenode)); p->adjvex =end-1; p->w =duttem; Graph[end-1].id ++; p->nextedge =Graph[begin-1].firstedge ; Graph[begin-1].firstedge =p; 3.2 求关键路径的算法 利用AOE网进行工程管理时,需解决的两个主要问题:其一,计算完成整个工程的最短工期;其二,确定关键路径,以找出哪些活动时影响工程进度的关键。 计算其过程必须分别在拓扑有序和逆拓扑有序的前提下进行。也就说,ve[k]必须在事件vk所有前驱的最早发生的时间求得之后才能确定。因此,可以在拓扑排序的基础上计算ve[k]和vl[k]。由此得到求解关键路径的方法:首先输入e条有向边,建立AOE网的邻接表存储结构;然后从始点出发,令事件的最早发生时间为0,按拓扑有序求其余各顶点时间的最早发生时间ve[k]; 其次从终点出发,令事件最迟发生时间等于其最早发生时间,按你你逆拓扑排序求其余各顶点事件最迟发生时间 vl[k]。 最后根据各顶点事件的ve和vl值,求所有活动最早开始时间ee和最迟开始时间el。如果某活动满足条件ee=el,则为关键活动。 if(el[i]==ee[i]) { printf(" 此弧为关键活动 "); }