




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五题:关键路径问题1、需求分析:当一项工程被划分为若干个子任务或活动后,人们不仅需要确定这些活动的先后次序,而且需要进一步计算完成整个工程的时间,确定哪些活动是影响工程进度的关键活动,以便合理组织人力、物力、财力,加快这些活动的进度,为按时或提前完成整个工程提供保证。要求:给定一个带权的有向图代表一个工程的AOE网络,研究如下问题:(1)完成整项工程至少需要多少时间?(2)哪些活动是影响工程进度的关键活动?示例图:2、设计21设计思想:(1)数据结构设计本题中的数据结构主要影响在于整个程序设计过程中数据的存储和拓扑排序、关键路径算法的实现,而在算法的实现过程中又要依赖数据的存储结构,而在图的存储结构中,比较适合实现拓扑排序算法的显然是邻接表的存储结构,所以本程序设计过程中均采用的是邻接表的存储方法。其主要数据的主要存储结构体声明如下:typedef struct ArcNodeint adjvex; /该弧所指向的顶点的位置struct ArcNode *nextarc;/指下一条弧的指针int info;/该弧相关信息 即权值int name;/弧的名字ArcNode;typedef struct VNodeint data;/顶点的信息ArcNode *firstarc;/指向第一条依附该顶点的弧的指针AdjListMAX_V_NUM;typedef struct AdjList vertices;int vnum,arcnum;/图中当前顶点数和弧数char kind,kind1;/图中的各类标志顶点和弧ALGraph;同时由于拓扑排序实现过程中要用到进栈和出栈的操作,因此还有栈的声明如下:typedef struct int *base;int *top;int stacksize;Stack;(2)算法设计本程序的算法设计主要体现在拓扑排序和求事件的最早发生时间和最迟发生时间的的过程中,因此算法设计主要也是针对拓扑排序和求事件发生的最早发生和最迟发生时间的算法设计。拓扑排序的思想是将入度为零的结点进行S1中的出栈操作,同时将其对T进行进栈,这主要是方便在进行完求最早发生时间后,通过出栈的操作直接求最迟发生时间。2.2设计表示(1)、函数调用关系图及其说明如下:(2)函数接口说明:函数中的参数均是使用的全局变量的传递,因而在函数间进行传递的过程中比较简单,下面就将主要函数及他们之间的参数的关系列出如下:int InitStack(Stack &S);int Push(Stack &S,int &e);int Pop(Stack &S,int &e);int CriticalPath(ALGraph &G);int ToPoOrder(ALGraph &G,Stack &T);int FindInDegree(ALGraph &G,int (&indegree)MAX_V_NUM);2.3详细设计该程序的算法主要在以下四个方面:拓扑排序、求出事件的最早发生时间、求出事件的最迟发生时间、求出关键活动,其中关键活动的算法设计较为简单,即是在求出各活动的最早发生时间和最迟发生时间的前提下根据判断两时间是否相等,来判断是否是关键活动,因而主要的算法设计便在前三个方面。拓扑排序与求事件的最早发生时间相结合,拓扑排序即将入度为零的栈S中的元素依次出栈,同时将该元素进栈到栈T中,在进栈的同时求出其最早发生时间算法如下:从ve(0)=0开始向前递推Ve(j)=然后便是求事件的最迟发生时间,该过程就是对上面的过程中得到的栈T进行依次出栈,同时求其最迟发生时间,其算法简要描述如下:从vl(n-1)=ve(n-1)起向后递推Vl(i)=具体实现见代码中int ToPoOrder(ALGraph &G,Stack &T)和int CriticalPath(ALGraph &G)函数;3、调试分析该程序的调试过程较为轻松,基本在算法实现的基础上没有出现什么错误,因而在调试的过程中并无什么深刻印象。4、用户手册点击运行程序,在弹出的窗口中,会提示要输入的信息:1、 提示信息为:“请输入图中的顶点数和弧数以及图的标志和弧的标志:”按要求输入即可,本题即输入9 11 v a2、 提示信息为“请完成该邻接表的输入”:由于邻接表的输入信息一般较多,而且均是采用的链表来存储,因而该部分的输入要特别的小心3、 在完成上面两步的输入后按enter键便能得到程序的运行结果,即输出完成整项工程至少需要多少时间和影响工程进度的关键活动 5 测试数据及测试结果测试数据如下:9 11 v a131 6 12 4 23 5 3214 1 4314 1 5415 2 6526 9 77 7 8617 4 9718 2 10818 4 1190程序运行结果如下:6、原程序清单如下:/*关键路径问题2010年07月31日晚上08:36开始动工#includeusing namespace std;const int MAX_V_NUM=20;/最大存储顶点的数目const int STACK_INIT_SIZE=20;/栈的存储空间分配量/数据存储部分/*一下是图的邻接表的存储表示,由于第一次用 用的比较的生疏*/typedef struct ArcNodeint adjvex; /该弧所指向的顶点的位置struct ArcNode *nextarc;/指下一条弧的指针int info;/该弧相关信息 即权值int name;/弧的名字ArcNode;typedef struct VNodeint data;/顶点的信息ArcNode *firstarc;/指向第一条依附该顶点的弧的指针AdjListMAX_V_NUM;typedef struct AdjList vertices;int vnum,arcnum;/图中当前顶点数和弧数char kind,kind1;/图中的各类标志顶点和弧ALGraph;typedef struct int *base;int *top;int stacksize;Stack;int veMAX_V_NUM;Stack T;/函数体描述部分int InitStack(Stack &S);int Push(Stack &S,int &e);int Pop(Stack &S,int &e);int CriticalPath(ALGraph &G);int ToPoOrder(ALGraph &G,Stack &T);int FindInDegree(ALGraph &G,int (&indegree)MAX_V_NUM);/*下面是函数的具体实现部分*/构造一个空栈int InitStack(Stack &S)S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int);if(!S.base)return 0;S.top=S.base;S.stacksize=STACK_INIT_SIZE;/可以用于当栈的存储空间不够的情况下 进行扩充return 1;/元素进栈int Push (Stack &S, int &e)*S.top+=e;return 1;/元素出栈int Pop(Stack &S, int &e)if(S.top=S.base)return 0;e=*-S.top;return 1;/判断栈是否为空int StackEmpty(Stack &S)if(S.top=S.base)return 1;else return 0;/找出每个顶点的入度int FindInDegree(ALGraph &G,int (&indegree)MAX_V_NUM)ArcNode *p;int i;for(i=0;iMAX_V_NUM;i+)indegreei=0;for(i=0;inextarc)indegreep-adjvex+;return 0;/拓扑排序同时求出各活动的最早发生时间int ToPoOrder(ALGraph &G,Stack &T)int count=0;int i,j,k;Stack S1;ArcNode *p;int indegreeMAX_V_NUM;InitStack(T);InitStack(S1);FindInDegree(G,indegree);for(i=0;iG.vnum;i+)if(indegreei=0)Push(S1,i);/建立0入度顶点栈Sfor(i=0;inextarc)k=p-adjvex;if(-indegreek=0)Push(S1,k);if(vej+(p-info)vek)vek=vej+(p-info);/for(i=0;iG.vnum;i+)/coutveiendl;if(countG.vnum)return 0;else return 1;/计算各顶点的最迟发生时间及进行输出int CriticalPath(ALGraph &G)int vlMAX_V_NUM;int dut;int i,j,k,ee,el;ArcNode *p;/char tag;if(!ToPoOrder(G,T)return 0;cout完成整项工程至少需要的时间是:veG.vnum-1endl;for(i=0;inextarc)k=p-adjvex;dut=(p-info);if(vlk-dutvlj)vlj=vlk-dut;/for(i=0;iG.vnum;i+)/coutvliendl;cout影响工程进度的关键活动是:endl;for(j=0;jnextarc)k=p-adjvex;dut=(p-info);ee=vej;el=vlk-dut;/coutj=jK=kdut=dutee=eeel=elendl;if(ee=el)/tag=(ee=el)?*:;coutG.kind1nameendl;return 1;int main()ALGraph G;int i,j,Hnum;ArcNode *p,*q;/int indegreeMAX_V_NUM;/ALGraph G;cout请输入图中的顶点数和弧数以及图的标志和弧的标志:G.vnum;cinG.arcnum;cinG.kind;cinG.kind1;cout请完成该邻接表的输入:endl;for(i=0;iG.vnum;i+)cout请输入该顶点的信息G.verticesi.data;cout请输入与G.kindG.verticesi.data号顶点相邻的弧的数目:Hnum;if(Hnum=0)G.verticesi.firstarc=0;elsecout请依次次输入弧的信息(包括顶点的位置及权值和该边的名称)nextarc=0;cinp-adjvex;cinp-info;cinp-name;for(j=0;jHnum-1;j+)cout请依次次输入弧的信息(包括顶点的位置及权值和该边的名称)q-adjvex;cinq-info;cinq-name;q-nextarc=p-nextarc;p-nextarc=q;/ToPoOrder(G,T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025重庆市綦江区教育事业单位面向应届毕业公费师范生考核招聘60人笔试备考试题及答案解析
- 2025中级软考通关题库及答案详解
- 心理危机干预报告
- 2025浙江温州瑞安市司法局编外人员招聘1人笔试备考试题及答案解析
- 企业人文内涵塑造策略
- 大学化学教学方法与实践
- 绿化工程的推广及意义
- 纺织品包装设计手册
- 2025西安雁塔区长延堡社区卫生服务中心招聘笔试含答案
- 2025年口腔颌面外科颌骨骨折固定术后并发症处理技巧模拟考试试卷答案及解析
- 生活垃圾填埋场环境污染的排查与治理方案
- 800个产粮大县名单
- 孕产妇情绪管理课件
- 警务实战教官教学法课件
- 中式面点初级培训课件
- 海外直播活动策划方案
- 2025年零售与电商行业:电商行业人才需求与培养策略分析
- 2025年N1叉车司机模拟考试1000题及答案
- 家具公司安全操作规程
- 当前安全生产面临形势安全生产
- 2025高等教育人工智能发展报告
评论
0/150
提交评论