AOE-网求关键路径

AOE-网求关键路径

AOE-网,即边表示活动的网。
活动的最早发生时间和最迟发生时间相同的活动即为关键活动。

代码实现

算法详解见注释

//求各顶点事件的最早发生时间ve
Status TopologicalOrder(ALGraph G,Stack &T) {
	//有向图G采用邻接表存储结构
	FindINDegree(G, indegree);
	//对各顶点求入度
	InitStack(T);
	count = 0;//入栈计数
	ve[0..G.vexnum - 1] = 0;//初始化
	while (!StackEmpty(S)) {
		Pop(S, j);
		Push(T, j);
		++count;
		for (p = G.vertices[i].firstarc; p; p = p->nextarc) {
			k = p->adjvex;
			if (!(--indegree[k])) {
				Push(S, k);//对i顶点的每个邻接点的入度减一,若之后入度为0,则入栈
				if (ve[j] + *(p->info) > ve(k)) {
					ve[k] = ve[j] + *(p->info);
				}//修改最早发生时间
			}
		}
	}
	if (count < G.vexnum) {
		return ERROR;
	}//该有向图有回路
	else return OK;
}
//输出G的各项关键活动
Status CriticalPath(ALGraph G) {
	if (!TopologicalOrder(G, T))
		return ERROR;
	vl[0..G.vexnum - 1] = ve[0..G.vexnum - 1];//初始化
	while (!StackEmpty(S)) {
		for (Pop(G, j), p = G.vertices[i].firstarc; p; p = p->nextarc) {
			k = p->adjvex;
			dut = *(p->info);
			if (vl[k] - dut < vl[j]) {
				vl[j] = vl[k] - dut;
			}
		}
	}
	for (j = 0; j < G.vexnum; ++j) {
		for (p = G.vertices[i].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);//输出关键活动
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值