示例#1
0
 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;
 }
示例#2
0
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
示例#3
0
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;
}