求解AOE网的关键路径(CriticalPath)

一、算法思想
 
二、算法如下
 1 bool TopologicalOrder(ALGraph G, Stack &T){
 2     //有向网G采用邻接表存储结构,求各顶点时间的最早发生时间ve(全局变量)。
 3     //T为拓扑序列顶点栈,S为零入度顶点栈。
 4     //若G无回路,则用栈T返回G的一个拓扑序列,返回值为true,否则为false。
 5     FindIndegree(G,indegree);//对各个顶点求入度indegree[0......G.vextex_num-1]
 6     InitStack(T);
 7     count = 0;
 8     for(int i =0; i < G.vextex_num; i++)
 9         ve[i] = 0;      //初始化
10     while(!IsEmpty(S)){
11         Pop(S,j);   Push(T,j);  ++count;//j号顶点入栈T并计数
12         for(p = G.vertices[j].firstarc; p; p = p->nextarc){
13             k = p->adjvex;  //对j号顶点的每个邻接点的入度减1
14             if(!(--indegree[k]))    Push(S,k);
15             if(ve[j] + *(p->info) >ve[k])   ve[k] = ve[j] +  *(p->info);
16         }//for  *(p->info) = dut<j,k>
17     }//while
18     if(count < G.vertex_num)    return false;
19     else return true;
20 }//TopologicalOrder
21 
22 bool CriticalPath(ALGraph G){
23     //G为有向网,输出G的各项关键活动
24     if(!TopoligicalOrder(G,T))  return false;
25     for(int i =0; i < G.vextex_num; i++)
26         vl[i] = ve[i];  //初始化顶点事件的最迟发生时间
27     while(!IsEmpty(T)) //按逆拓扑排序求各顶点的vl值
28         for(Pop(T,j),p = G.vertices[j].firsrarc; p; p = p->nextarc){
29             k = p->adjvex;  dut = *(p->info)    //det<j,k>
30             if(vl[k]-dut < vl[j])   vl[j] = vl[k] -dut;
31         }//for
32     for(j = 0; j < G.vertex_num; j++)   //求ee,el和关键活动
33         for(p = G.vertices[j].firstarc; p; p = p->nextarc){
34             k = p->adjvex;  dut = *(p->info);
35             ee = ve[j]; el = vl[k] - dut;
36             tag = (ee == el) ? '*' : '';
37             printf(j,k.dut,ee,el,tag);//输出关键活动
38         }//for
39 }//CriticalPath

 

三、算法性能分析
  时间复杂度:由于计算弧的活动最早开始时间和最迟开始时间的复杂度为O(e),所以总的求关键路径的时间复杂度为O(v+e).
posted @ 2021-11-30 15:16  某科学的撒把豆子  阅读(100)  评论(0)    收藏  举报