求解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).

浙公网安备 33010602011771号