• 数据结构--6.2关键路径


    AOE网

            在一个表示工程的带权有向图中,用顶点表示事件,用有向边上的权值表示活动表示持续时间,这种有向图的边表示活动的网,我们称为AOE网(Activity On Edge Network)。

    我们把AOE网中没有入边的顶点称为始点或源点,没有出边的顶点称为终点或汇点。

     

    ——etv(Earliest Time Of Vertex)

            事件最早发生时间,就是顶点的最早发生时间。 

    ——ltv (Latest Time Of Vertex)

            事件最晚发生时间,就是每个顶点对应的事件最晚需要开始的时间,如果超出此时间将会延误整个工期。 

    ——ete (Earliest Time Of Edge)

            活动的最早开工时间,就是弧的最早发生时间。

    ——lte (Latest Time Of Edge)

            活动的最晚发生时间,就是不推迟工期的最晚开工时间。

    1. #define
    2. //边表结点声明
    3. typedef struct EdgeNode
    4. {
    5. int adjvex;
    6. struct EdgeNode * next;
    7. }EdgeNode;
    8. //顶点表结点声明
    9. typedef struct VertexNode
    10. {
    11. int in; //顶点入度
    12. int data;
    13. EdgeNode * firstedge;
    14. }VertexNode,AdjList[MAXVEX];
    15. typedef struct
    16. {
    17. AdjList adjList;
    18. int numVertexes,numEdges;
    19. }graphAdjList , *GraphAdjList;
    20. int *etv,*ltv;
    21. int *stack2; //用于存储拓扑序列的栈
    22. int top2; //用于stack2的栈顶指针
    23. //拓扑排序算法
    24. //若GL无回路,则输出拓扑排序序列并返回OK,否则返回ERRor
    25. Status TopologicalSort(GraphAdjList GL)
    26. {
    27. EdgeNode *e;
    28. int i,k,gettop;
    29. int top = 0; //用于栈指针下标索引
    30. int count = 0; //用于统计输出顶点的个数
    31. int *stack; //用于存储入度为0的顶点
    32. stack = (int *)malloc(GL->numVertexes * sizeof(int));
    33. for(i=0;i < GL->numVertexes;i++)
    34. {
    35. if(0 == GL->adjList[i].in)
    36. {
    37. stack[++top] = i; //将度为0的顶点下标入栈
    38. }
    39. }
    40. //初始化etv都为0
    41. top2 = 0;
    42. etv = (int *)malloc(GL->numVertexes * sizeof(int));
    43. for(i=0;i < GL->numVertexes * sizeof(int))
    44. {
    45. etv[i] = 0;
    46. }
    47. stack2 = (int *)malloc(GL->numVertexes * sizeof(int));
    48. while(0 != top)
    49. {
    50. gettop = stack[top--]; //出栈
    51. stack2[++top2] = gettop; //保存拓扑序列顺序
    52. count++;
    53. for(e = GL->adjList[gettop].firstedge;e;e=e->next)
    54. {
    55. k = e->adjvex;
    56. //将k号顶点邻接点的入度-1,因为他的前驱已经消除
    57. //接着判断-1后入度是否为0,如果为0则也入栈
    58. if(!(--GL->adjList[k].in))
    59. {
    60. stack[++top] = k;
    61. }
    62. if((etv[gettop]+e->weight) > etv[k])
    63. {
    64. etv[k] = etv[gettop] + e->weight;
    65. }
    66. }
    67. }
    68. if(count numVertexes ) //如果count小于顶点数,说明存在环
    69. {
    70. return ERROR;
    71. }
    72. else
    73. {
    74. return OK;
    75. }
    76. }
    77. //求关键路径,GL为有向图,输出GL的各项关键活动
    78. void CriticalPath(GraphAdjList GL)
    79. {
    80. EdgeNode *e;
    81. int i,gettop,k,j;
    82. int ete,lte;
    83. TopologicalSort(GL);
    84. ltv = (int *)malloc(GL->numVertexes * sizeof(int));
    85. for(i=0;inumVertexes;i++)
    86. {
    87. ltv[i] = etv[GL->numVertexes-1];
    88. }
    89. //从汇点倒过来逐个计算ltv
    90. while(0 !=top2)
    91. {
    92. gettop = stack2[top2--]; //第一个出栈是汇点
    93. for(e = GL->adjList[gettop].firstedge; e ;e=e->next)
    94. {
    95. k = e->adjvex;
    96. if((ltv[k]- e->weight) < ltv[gettop])
    97. {
    98. ltv[gettop] = ltv[k] - e->weight;
    99. }
    100. }
    101. }
    102. //通过etv和ltv求ete和lte
    103. for(j=0;jnumVertexes;j++)
    104. {
    105. for(e = GL->adjList[j].firstedge; e; e = e->next)
    106. {
    107. k = e->adjvex;
    108. ete = etv[j];
    109. lte = ltv[k] - e->weight;
    110. if(ete == lte)
    111. {
    112. printf(" length: %d , ",GL->adjList[j].data,GL->adjList[k].data,e->weight);
    113. }
    114. }
    115. }
    116. }

  • 相关阅读:
    Python xml 文件解析操作之 ElementTree 模块
    华为机试真题 Java 实现【出错的或电路】
    近地面无人机植被定量遥感与生理参数反演实践技术应用
    星宸科技SSC369G 双4K高性价比AI IPC方案
    Vue项目中v-bind动态绑定src路径不成功问题及解决
    嵌入式C设计模式---职责链设计模式
    Configmap配置与Secret加密
    R语言快速入门课——结合各种生物信息学及医学案例,使R语言快速入门——R软件及Rstudio下载(同步课程正在更新中)
    4 行 Python 代码开发新闻网站通用爬虫
    【python】任务调度编排工具 schedule | python定时任务工具
  • 原文地址:https://blog.csdn.net/ww1425408527/article/details/132670064