设有一个工程网络如下图表示(无环路的有向图):
其中,顶点表示活动,①表示工程开始,⑤表示工程结束(可变,用N表示),边上的数字表示活动延续的时间。
如上图中,活动①开始5天后活动②才能开始工作,而活动③则要等①、②完成之后才能开始,即最早也要7天后才能工作。
在工程网络中,延续时间最长的路径称为关键路径。上图中的关键路径为:①—②—③—④—⑤共18天完成。
关键路径的算法如下:
1.数据结构:
R[1..N,1..N]OF INTEGER; 表示活动的延续时间,若无连线,则用-1表示;
EET[1..N] 表示活动最早可以开始的时间
ET[1..N] 表示活动最迟应该开始的时间
关键路径通过点J,具有如下的性质:EET[J]=ET[J]
2.约定:
结点的排列已经过拓扑排序,即序号前面的结点会影响序号后面结点的活动。
程序清单:
#include <iostream>
#include <cstdio>
using namespace std;
int i,j,n,max,min,w,x,y,r[21][21],eet[21],et[21];
int main( )
{
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
r[i][j]=-1;
scanf("%d%d%d",&x,&y,&w);
/*输入从活动x到活动y的延续时间,以0为结束*/
while( x!=0 ){
r[x][y]=w;____(1)_____
}
eet[1]=0;
for(i=2;i<=n;i++){
max=0;
for(i=1;i<=n;i++)
if(r[j][i]!=-1)
if( ___(2)___ ) max=r[j][i]+eet[j];
eet[i]=max;
}
___(3)____;
for(i=n-1;i>=1;i--){
min=10000;
for(j=1;j<=n;j++)
if( r[i][j]!=-1)
if( ___(4)___ ) min=et[j]-r[i][j];
et[i]=min;
}
printf("%d",eet[n]);
for(i=1;i<=n-1;i++)
if( __(5)___ ) printf("%d-->",i);
printf("%d",n);
return 0;
}
/*
答案:
(1)、scanf("%d%d%d",&x,&y,&w);
(2)、r[j][i]+eet[j]>max
(3)、et[n]=eet[n];
(4)、et[j]-r[i][j]<min
(5)、eet[i]==et[i]
*/