| 网站首页 | 新闻快报 | 软件教程 | 硬件教程 | 设计学院 | Q Q 专区 | 编程开发 | 网络安全 | 
您现在的位置: 浩扬网络 >> 编程开发 >> VC C编程 >> 教程正文
数据结构中关键路径算法的实现与应用
作者:不详 文章来源:安全中国 点击数: 更新时间:2006-8-4 20:07:24

摘  要  介绍求关键路经的算法,对于给出的事件结点网络,要求求出从起点到终点的所有路径,经分析、比较后找出长读最大的路径,从而得出求关键路径的算法,并给出计算机上机实现的源程序。

关键词  关键路径 最少时间

1:引言

通常把计划、施工过程、生产流程、程序流程的都当成一个工程。除了很小的工程外、一般都把工程分为若干个叫做“活动”的子工程。完成了这些“活动”的子工程,这个工程就可以完成了。

通常我们用有向图表示一个工程。在这种有向图中,用顶点表示活动,用有向边

<Vi,Vj>表示活动Vi必须先于活动Vj进行。如果在无有向环的带权有向图中用有向边表示一个工程中的各项活动(ACTIVITY),用有向边上的权值表示活动的持续时间(DURATION),用顶点表示事件(EVENT),则这种的有向图叫做用边表示活动的网络,简称AOE(active on edges)网络。

    AOE网络在某些工程估算方面非常有用。他可以使人们了解:

         (1):研究某个工程至少需要多少时间?

         (2):那些活动是影响工程进度的关键?

在AOE网络中,有些活动可以并行的进行。从源点到各个顶点,以至从源点到汇点的有向路径可能不止一条。这些路径的长度也可能不同。完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,这个工程才算完成。因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和。这条路径长度就叫做关键路径(critical path)。

2:设计步骤:

    1: 以某一工程为蓝本,采用图的结构表示实际的工程计划的时间。

    2: 调查以分析和预测这个工程计划个阶段的时间。

           3: 用调查的结果建立AOE网(Activity On Edge Network),即边表示活动的网络,并用图的形式表示。

4: 用图来存储这些信息。

        5: 用CreateGraphic();函数建立AOE图。

        6: 用SearchMapPath();函数求出最大路径,并打印出关键路径。

        7:编写代码

        8: 测试

3: 设计代码:

#include<stdio.h>

#include<stdlib.h>

#include<iomanip.h>

#include <process.h>

//#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 activenumber)

{

       int begin,end,duttem;

       edgenode *p;

       for(int i=0;i<projectnumber;i++)

       {

        Graphicmap[i].projectname=i;

              Graphicmap[i].id =0;

              Graphicmap[i].link =NULL;

       }     

       printf("某项目的开始到结束在图中的节点输入<vi,vj,dut>\n");

       printf("如:3,4,9 回车表示第三节点到第四节点之间的活动用了9个单位时间\n");

       for(int k=0;k<activenumber;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 activenumber,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));//用来表示活动Ai最迟完成开始时间

       int* e=(int*)malloc(activenumber*sizeof(int));//表示活动最早开始时间

       edgenode *p;

       totaltime=0;

       for(i=0;i<projectnumber;i++) ve[i]=0;

       for(i=0;i<projectnumber;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 ;

              }

       }
【教程录入:残梦    责任编辑:残梦 】
发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
  • 上一篇教程:

  • 下一篇教程:
  • 网友评论:(评论内容只代表网友观点,与浩扬网络立场无关!)
    热门文章

    赞助商


    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 |