关键路径求解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构中关键路径算法的实现与应用
摘要介绍求关键路经的算法,对于给出的事件结点网络,要求求出从起点到终点的所有路径,经分析、比较后找出长读最大的路径,从而得出求关键路径的算法,并给出计算机上机实现的源程序。
关键词关键路径最少时间
1:引言
通常把计划、施工过程、生产流程、程序流程的都当成一个工程。除了很小的工程外、一般都把工程分为若干个叫做“活动”的子工程。完成了这些“活动”的子工程,这个工程就可以完成了。
通常我们用有向图表示一个工程。在这种有向图中,用顶点表示活动,用有向边
AOE网络在某些工程估算方面非常有用。他可以使人们了解:
(1):研究某个工程至少需要多少时间?
(2):那些活动是影响工程进度的关键?
在AOE网络中,有些活动可以并行的进行。从源点到各个顶点,以至从源点到汇点的有向路径可能不止一条。这些路径的长度也可能不同。完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,这个工程才算完成。因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和。这条路径长度就叫做关键路径(criti cal path)。
2:设计步骤:
1: 以某一工程为蓝本,采用图的结构表示实际的工程计划的时间。
2: 调查以分析和预测这个工程计划个阶段的时间。
3: 用调查的结果建立AOE网(Activity On Edge Network),即边表示活动的网络,并用图的形式表示。
4: 用图来存储这些信息。
5: 用CreateGraphic();函数建立AOE图。
6: 用SearchMapPath();函数求出最大路径,并打印出关键路径。
7:编写代码
8: 测试
3: 设计代码:
#include
#include
#include
#include
//#define PROJECTNUMBER 9//10
//#define PLANNUMBER 11//13
typedef struct node
{
int adjvex;
int dut;
struct node *next;
}edgenode;
typedef struct
{
int projectname;
int id;
edgenode *link;
}vexnode;
//vexnode Graphicmap[PROJECTNUMBER];
void CreateGraphic(vexnode* Graphicmap,int projectnumber,int activenu mber)
{
int begin,end,duttem;
edgenode *p;
for(int i=0;i { Graphicmap[i].projectname=i; Graphicmap[i].id =0; Graphicmap[i].link =NULL; } printf("某项目的开始到结束在图中的节点输入 printf("如:3,4,9 回车表示第三节点到第四节点之间的活动用了9个单位时间\n"); for(int k=0;k { scanf("%d,%d,%d",&begin,&end,&duttem); p=(edgenode*)malloc(sizeof(edgenode)); p->adjvex =end-1; p->dut =duttem; Graphicmap[end-1].id ++; p->next =Graphicmap[begin-1].link ; Graphicmap[begin-1].link =p; } } int SearchMapPath(vexnode* Graphicmap,int projectnumber,int activenum ber,int& totaltime) { int i,j,k,m=0; int front=-1,rear=-1; int* topologystack=(int*)malloc(projectnumber*sizeof(int));//用来保存拓扑排列 int* vl=(int*)malloc(projectnumber*sizeof(int));//用来表示在不推迟整个工程的前提下,VJ允许最迟发生的时间 int* ve=(int*)malloc(projectnumber*sizeof(int));//用来表示Vj最早发生时间 int* l=(int*)malloc(activenumber*sizeof(int));//用来表示活动A i最迟完成开始时间 int* e=(int*)malloc(activenumber*sizeof(int));//表示活动最早开始时间 edgenode *p; totaltime=0; for(i=0;i for(i=0;i { if(Graphicmap[i].id==0) { topologystack[++rear]=i; m++; } > } while(front!=rear) { front++; j=topologystack[front]; m++; p=Graphicmap[j].link ; while(p) { k=p->adjvex ; Graphicmap[k].id --; if(ve[j]+p->dut >ve[k]) ve[k]=ve[j]+p->dut ; if(Graphicmap[k].id ==0) topologystack[++rear]=k; p=p->next ; } } if(m { printf("\n本程序所建立的图有回路不可计算出关键路径\n "); printf("将退出本程序\n"); return 0; } totaltime=ve[projectnumber-1]; for(i=0;i vl[i]=totaltime;