拓扑排序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
一、系统开发的背景 (1)
(一)问题描述 (1)
(二)任务要求 (1)
(三)测试数据 (2)
(四)系统模块结构设计 (2)
三、系统的设计与实现 (3)
(一)系统流程图: (3)
(二)主函数模块 (4)
(三)图存储结构的建立 (4)
四、系统测试 (8)
(一)测试界面选择的实现 (8)
(二)测试拓扑排序的实现 (8)
(三)测试关键活动的实现 (8)
五、总结 (9)
六、附件(代码、部分图表) (10)
拓扑排序
一、系统开发的背景
为了在科技不断进步的今天能够紧跟着时代的步伐,人们开始不断地追求方便和快捷的生活方式,在这个新鲜的时代,越来越多的新鲜事物层出不穷,为人们提供着各种方便和便利,为了更好地适应和接受这个时刻进步着的社会,我们要努力赶上。在实际工作中,经常要使用一个有向图来表示工程的施工流程或者产品生产的流程图。也就是说,一个大的工程经常被划分为若干个较小的子工程,这些子工程称为“活动”(Activity)。当这些子工程全部完成时,整个工程也就完成了。并且更要关心整个工程完成的最短时间,这就是有向权图的另一个重要应用——工程进度的关键路径问题。用图的邻接表(出边表)表示方法,实现拓扑排序和关键路径的求解过程。
二、系统分析与设计
(一)问题描述
拓扑排序可判断AOV网络中是否存在回路,使得所有活动可排成一个线性序列,使用每个活动的所有前驱活动都排在该活动的前面。
关键路径的工期决定了整个项目的工期。任何关键路径上的终端元素的延迟将直接影响项目的预期完成时间(例如在关键路径上没有浮动时间)。
(二)任务要求
构建AOV网络,并输出其拓扑序列结果,输出该图的关键路径和关键活动,存储结构自行选择。
(三)测试数据
自行设定(结点数不少于10个)。
(四)系统模块结构设计
分析:此问题实现需采用拓扑排序和关键路径实现AOV网的拓扑排序和AOE网的关键路径求法,而在求关键路径过程中又用到了拓扑排序来判断图中是否存在回路。为了保持图的初始化一致性,虽然在拓扑排序算法中不需要求边的权值,但关键路径需要。所以在输入图的时候都规定了一种格式:(v1,v2,w1),表示边(v1,v2)上的权值为w1。
通过对系统功能的分析,拓扑排序的实现功能如图1所示。
图1拓扑排序的实现功能图
通过上图的功能分析,把整个系统划分为4个模块:
1、完成对图的建立,该模块主要实现:完成数据的存储,并将数据引
入AOV网中;
2、AOE网的拓扑排序,该模块主要实现:使得所有活动可排成一个线性序列,使用每个活动的所有前驱活动都排在该活动的前面进行排序;
3、 AOE网的关键路径,该模块主要实现:找出众多活动中的某条具体关键路径;
4、实现对结果的正确输出,该模块主要实现:对结果的正确输
出与检测;
三、系统的设计与实现
(一)系统流程图:
(二)主函数模块
main函数首先调用SqStack ToPoSort;SqStack ToPoReverseSort;函数来定义栈,调用InitStack(ToPoSort);来初始化存拓扑排序的栈和InitStack(ToPoReverseSort);来初始化逆拓扑排序的栈。
其次调用CreateALGraph(ALGraph &graph)函数定义和初始化AOE网,调用TopologicalSor t(ALGraph &graph,SqStack &ToPoReverseSort) 函数求拓扑序列和调用PutInfoToPoSort(ToPoSort,graph);函数来输出输出拓扑顺序排序。
然后调用GetVeAndVl(graph,ToPoSort,ToPoReverseSort) 函数求结点和活动的最晚开始时间、最早开始时间并输出。
最后调用Status CriticalPath(ALGraph &graph,SqStack RevSort)函数来求关键活动、关键事件并输出。
(三)图存储结构的建立
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.求取关键路径 利用AOE网进行工程管理时,需解决的两个主要问题:其一,计算完成整个工程的最短工期;其二,确定关键路径,以找出哪些活动时影响工程进度的关键。因此须计算以下几点: (1)事件的最早发生时间ve[k]; (2)事件最迟发生时间vl[k]; (3)活动最早开始时间ee[i]; (4)活动的最迟开始时间el[i]; 计算其过程必须分别在拓扑有序和逆拓扑有序的前提下进行。也就说,ve[k]必须在事件vk所有前驱的最早发生的时间求得之后才能确定。因此,可以在拓扑排序的基础上计算ve[k]和vl[k]。由此得到求解关键路径的方法: 首先输入e条有向边,建立AOE网的邻接表存储结构;然后从始点出发,令事件的最早发生时间为0,按拓扑有序求其余各顶点时间的最早发生时间ve[k];