关键路径求法

关键路径概念:

      在无回路的有向网络中,假设只有一个入度为0的顶点(称为源点)和一个出度为0的顶点(称为汇点),则从源点到汇点之间的最长的路径称为关键路径。

AOE网:

    无回路有向网络可以用来表示一个包含多项活动的工程计划:有向边表示一项活动,边上的权表示完成这项活动需要的时间;顶点表示"所有入边代表的活动已完成,出边代表的活动可以开始"这样一种状态或者事件,其中源点表示工程的开始,汇点表示工程的结束;源点到汇点的某一关键路径上边的权值之和表示完成整个工程的计划时间。

    通过求有向网络的关键路径,可以算出整个工程从开始到结束至少需要多少时间;可以知道哪些活动是影响工程进度的关键活动。

    这种用边表示活动且只有一个源点和一个汇点的无回路有向网络称为边表示活动的网,简称AOE网。

两个与顶点有关的量:

    在下面的讨论中,假定AOE网有n个顶点,源点是V1,汇点是Vn。

    -最早发生时间:

        事件Vi的可能的最早发生时间earliest(i),它等于从源点V1到顶点Vi的最长路径长度。

    -最迟发生时间

        在保证汇点事件Vn在earliest(n)时刻发生的前提下,事件Vi允许的最迟发生时间latest(i),它等于earliest(i)减去从顶点Vi到汇点Vn的最长路径长度。

earliest数组的计算方法:

    -令earliest(1)=0;

    -按顶点的拓扑顺序计算earliest(j):

        earliest(j)=max{(earliest(i)+Wij)|Vi邻接到Vj}

    -例如

        earliest(a)=max{earliest(b)+u,earliest(c)+v}

latest数组的计算方法:

    -令latest(n)=earliest(n);

    -按顶点的逆拓扑顺序计算latest(i):

        latest(i)=min{(latest(j)-Wij)|Vj邻接于Vi}

    -例如:

        latest(a)=min{latest(d)-x,latest(e)-y}

两个与边有关的量:

    对于活动ak=,可以定义它的可能的最早开始时间和允许的最迟开始时间。

    -最早开始时间:活动ak的可能的最早开始时间等于事件Vi的可能的最早发生时间earliest(i)

    -最迟开始时间:活动ak的允许的最迟开始时间等于事件Vj的允许的最迟发生时间latest(j)减去完成该活动的计划时间Wij。

   关键路径求法_第1张图片

(最早发生,从前往后算;最迟发生,从后往前算。)

关键路径求法_第2张图片

 

求关键路径的算法:

    1、计算每个事件可能的最早发生时间

//计算每个事件可能的最早发生时间
template
void ExtLGraph:: Earliest(int* earliest, int* order)
{
    for(int i=0;i* p=a[k]; p; p=p->nextArc){
            int  j=p->adjVex;
	    if (earliest[j]w) 
	  	  earliest[j]=earliest[k]+p->w;
        }
  }
 }

    2、计算每个事件允许的最迟发生时间

//计算每个事件允许的最迟发生时间
template
void ExtLGraph:: Latest(int* latest,int* order,int longest)
{
	for (int i=0;i-1;i--){
        int j=order[i]; 
           for (ENode* p=a[j];p;p=p->nextArc) {
               int  k=p->adjVex;
   if (latest[j]>latest[k]-p->w)
		  latest[j]=latest[k]-p->w;
}
     }
 }

    3、输出关键活动

最早发生时间和最迟发生时间相等的事件,一般就是关键活动。

从源点到汇点具有最大长度的路径叫关键路径,在关键路径上的活动称为关键活动。



你可能感兴趣的:(数据结构)