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);//输出关键活动
}
}
}