AOE网(求关键路径)(c/c++)

      工程中想要知道完成工程至少需要多少时间以及影响工程进度的关键子工程,通过AOE网来解决。其中边表示活动,顶点表示事件。

      如下图:
在这里插入图片描述
      其中入度为0的点v0称为源点,出度为0的点v5称为汇点。当v1事件发生时,a0活动已经结束,当v0事件发生时,a0活动可以开始。

事件:

      任何一个顶点事件,都存在最早开始时间与不影响整个工期的最晚开始时间,最早开始时间用ve[i]来表示,最晚开始时间用vl[i]来表示。(early 和 late)

      最早开始时间:方向为从源点-> 汇点
      源点的最早开始时间为0,即ve[0]=0。其余顶点的最早开始时间ve[j]=max{ve[i]+arc[i][j]},即 j 顶点的最早开始时间为:任一顶点 i 的 ve[i] 加上从 i 到 j 的权值,取其中的最大值

      最晚开始时间:方向为从汇点-> 源点
      汇点的最晚开始时间等于其最早开始时间,vl[5]=ve[5]。其余顶点的最晚开始时间vl[i]=min{vl[j]-arc[i][j]},即 i 顶点的最晚开始时间为:任一顶点 j 的 vl[j] 减去从 i 到 j 的权值,取其中的最小值

      上图顶点时间的开始时间如下表:

顶点(事件)v0v1v2v3v4v5
ve032668
vl042678

      其中ve等于vl的顶点称为关键顶点,由它们组成路径称为关键路径,上图的关键路径为v0-v2-v3-v5。完成该工程至少需要的时间为8,影响工程进度的关键子工程为关键路径。

活动:

      类似的,活动的最早开始时间为e[k],最晚开始时间为l[k]。计算方法为:
      活动的最早开始时间为弧尾所指向事件的最早开始时间
      最晚开始时间为弧头所指向事件的最晚开始时间减去活动所需花费的时间

如下表:

边(活动)a0a1a2a3a4a5a6a7
e00332266
l10442567

      选取最早开始时间等于最晚开始时间的活动,它们所连接的路径为关键路径,该图的关键路径为:a1-a4-a6。它与通过事件所计算出的关键路径等效。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是AOE关键路径的C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_VERTEX_NUM 10 #define MAX_ARC_NUM 100 typedef struct ArcNode { int adjvex; int weight; struct ArcNode *nextarc; } ArcNode; typedef struct VNode { int data; ArcNode *firstarc; } VNode; typedef struct { VNode vertices[MAX_VERTEX_NUM]; int vexnum, arcnum; } AGraph; int *etv, *ltv; int *stack2; int top2 = -1; void CreateGraph(AGraph *G) { int i, j, k, w; ArcNode *p; printf("请输入顶点数和弧数:"); scanf("%d%d", &G->vexnum, &G->arcnum); printf("请输入%d个顶点:", G->vexnum); for (i = 0; i < G->vexnum; i++) { scanf("%d", &G->vertices[i].data); G->vertices[i].firstarc = NULL; } printf("请输入%d条弧的起点、终点和权值:\n", G->arcnum); for (k = 0; k < G->arcnum; k++) { scanf("%d%d%d", &i, &j, &w); p = (ArcNode *) malloc(sizeof(ArcNode)); p->adjvex = j; p->weight = w; p->nextarc = G->vertices[i].firstarc; G->vertices[i].firstarc = p; } } void TopologicalSort(AGraph *G) { int i, k, gettop; int top = -1; int *stack; stack = (int *) malloc(G->vexnum * sizeof(int)); for (i = 0; i < G->vexnum; i++) { if (G->vertices[i].firstarc == NULL) { stack[++top] = i; } } top2 = -1; etv = (int *) malloc(G->vexnum * sizeof(int)); for (i = 0; i < G->vexnum; i++) { etv[i] = 0; } stack2 = (int *) malloc(G->vexnum * sizeof(int)); while (top != -1) { gettop = stack[top--]; stack2[++top2] = gettop; for (ArcNode *p = G->vertices[gettop].firstarc; p != NULL; p = p->nextarc) { k = p->adjvex; if (--indegree[k] == 0) { stack[++top] = k; } if (etv[gettop] + p->weight > etv[k]) { etv[k] = etv[gettop] + p->weight; } } } if (top2 != G->vexnum - 1) { printf("该AOE存在环,无法进行拓扑排序!\n"); exit(0); } } void CriticalPath(AGraph *G) { int i, j, k; int ete, lte; ArcNode *p; TopologicalSort(G); ltv = (int *) malloc(G->vexnum * sizeof(int)); for (i = 0; i < G->vexnum; i++) { ltv[i] = etv[G->vexnum - 1]; } while (top2 != -1) { gettop = stack2[top2--]; for (p = G->vertices[gettop].firstarc; p != NULL; p = p->nextarc) { k = p->adjvex; if (ltv[k] - p->weight < ltv[gettop]) { ltv[gettop] = ltv[k] - p->weight; } } } for (j = 0; j < G->vexnum; j++) { for (p = G->vertices[j].firstarc; p != NULL; p = p->nextarc) { k = p->adjvex; ete = etv[j]; lte = ltv[k] - p->weight; if (ete == lte) { printf("<%d, %d> length: %d, ", j, k, p->weight); } } } } int main() { AGraph *G; G = (AGraph *) malloc(sizeof(AGraph)); CreateGraph(G); CriticalPath(G); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值