Status CriticalPath(ALGraph G) { // 算法7.14 G为有向网,输出G的各项关键活动 int vl[MAX_VERTEX_NUM]; // 事件最迟发生时间 SqStack T; int i,j,k,ee,el,dut; ArcNode *p; if(!TopologicalOrder(G,T)) // 产生有向环 return ERROR; j=ve[0]; // j的初值 for(i=1;i<G.vexnum;i++) if(ve[i]>j) j=ve[i]; // j=Max(ve[]) 完成点的最早发生时间 for(i=0;i<G.vexnum;i++) // 初始化顶点事件的最迟发生时间 vl[i]=j; // 为完成点的最早发生时间(最大值) while(!StackEmpty(T)) // 按拓扑逆序求各顶点的vl值 for(Pop(T,j),p=G.vertices[j].firstarc;p;p=p->nextarc) { // 弹出栈T的元素,赋给j,p指向j的后继事件k,事件k的最迟发生时间已确定(因为是逆拓扑排序) k=p->data.adjvex; dut=*(p->data.info); // dut=<j,k>的权值 if(vl[k]-dut<vl[j]) vl[j]=vl[k]-dut; // 事件j的最迟发生时间要受其直接后继事件k的最迟发生时间 } // 和<j,k>的权值约束。由于k已逆拓扑有序,故vl[k]不再改变 printf("\ni ve[i] vl[i]\n"); for(i=0;i<G.vexnum;i++) // 初始化顶点事件的最迟发生时间 { printf("%d %d %d",i,ve[i],vl[i]); if(ve[i]==vl[i]) printf(" 关键路径经过的顶点"); printf("\n"); } printf("j k 权值 ee el\n"); for(j=0;j<G.vexnum;++j) // 求ee,el和关键活动 for(p=G.vertices[j].firstarc;p;p=p->nextarc) { k=p->data.adjvex; dut=*(p->data.info); // dut=<j,k>的权值 ee=ve[j]; // ee=活动<j,k>的最早开始时间(在j点) el=vl[k]-dut; // el=活动<j,k>的最迟开始时间(在j点) printf("%s→%s %3d %3d %3d ",G.vertices[j].data,G.vertices[k].data,dut,ee,el); // 输出各边的参数 if(ee==el) // 是关键活动 printf("关键活动"); printf("\n"); } return OK; }
Status CriticalPath(ALGraph G) { // 算法7.14 // G为有向网,输出G的各项关键活动。 Stack T; int a,j,k,el,ee,dut; char tag; ArcNode *p; if (!TopologicalOrder(G, T)) return ERROR; for(a=0; a<G.vexnum; a++) vl[a] = ve[G.vexnum-1]; // 初始化顶点事件的最迟发生时间 while (!StackEmpty(T)) // 按拓扑逆序求各顶点的vl值 for (Pop(T, j), p=G.vertices[j].firstarc; p; p=p->nextarc) { k=p->adjvex; dut=p->info; //dut<j,k> if (vl[k]-dut < vl[j]) vl[j] = vl[k]-dut; } for (j=0; j<G.vexnum; ++j) // 求ee,el和关键活动 for (p=G.vertices[j].firstarc; p; p=p->nextarc) { k=p->adjvex;dut=p->info; ee = ve[j]; el = vl[k]-dut; tag = (ee==el) ? '*' : ' '; printf(j, k, dut, ee, el, tag); // 输出关键活动 } return OK; } // CriticalPath
Status CriticalPath(ALGraph &G) { SqStack T; int i,j,k; ArcNode *p; if (!TopologicalOrder(G,T)) { return ERROR; } j = G.vertices[0].data.ve;//j的初值 for (i = 1; i < G.vexnum;++i) { if (G.vertices[i].data.ve > j) { j = G.vertices[i].data.ve;//j = MAX(ve)完成点的最早发生时间 } } for (i = 0; i < G.vexnum; ++i)//初始化顶点事件的最迟发生时间 { G.vertices[i].data.vl = j; } while (!StackEmpty(T))//按逆拓扑序求各顶点的vl值 { Pop(T,j); p = G.vertices[j].firstarc; while (p) { k = p->data.adjvex;//后序顶点的值 if (G.vertices[k].data.vl - p->data.info->weight < G.vertices[j].data.vl) {//事件j的最迟发生时间 > 其直接后继事件的最迟发生时间 - <j,k>的权值 G.vertices[j].data.vl = G.vertices[k].data.vl - p->data.info->weight; //事件j的最迟发生时间 = 其直接后继事件的最迟发生时间 - <j,k>的权值 } p = p->nextarc; } } printf("\ni ve vl\n"); for (i = 0; i < G.vexnum; ++i) { printf("%d ",i);//输出序号 Visitel(G.vertices[i].data);//输出ve、vl的值 if (G.vertices[i].data.ve == G.vertices[i].data.vl) {//事件(顶点)的最早发生时间 = 最迟发生时间 printf(" 关键路径经过的顶点"); } printf("\n"); } printf("j k 权值 ee el\n"); for (j = 0; j < G.vexnum; ++j) { for (p = G.vertices[j].firstarc;p;p = p->nextarc) { k = p->data.adjvex;//邻接顶点(直接后继事件)的序号 p->data.info->ee = G.vertices[j].data.ve;//ee(活动<i,j>的最早开始时间 = (顶点j)事件最早发生时间) p->data.info->el = G.vertices[k].data.vl - p->data.info->weight; ////el(活动<j,k>的最迟开始时间)=(顶点k)事件最迟发生时间-<j,k>的权值 printf("%s->%s",G.vertices[j].data.name,G.vertices[k].data.name); OutputArcwel(p->data.info); if (p->data.info->ee == p->data.info->el) {//活动最早开始时间 = 活动最迟开始时间 printf(" 关键活动"); } printf("\n"); } } return OK; }