求关键路径,只需理解顶点(事件)和边(活动)各自的两个特征属性以及求法即可:

   Ø  先根据首结点的Ve(j)=0由前向后(正拓扑序列)计算各顶点的最早发生时间

   Ø  再根据终结点的Vl(j)等于它的Ve(j)由后向前(逆序拓扑)依次求解各顶点的最晚发生时间

   Ø  根据边的ee(i)等于它的发出顶点的Ve(j)计算各边的最早开始时间(最早开始,对应最早发生)

   Ø  根据边的ll(i)等于它的到达顶点的Vl(j)减去边的权值计算各边的最晚开始时间(最晚开始,对应最晚发生)

  1. #include<iostream>
    #include<cstring>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<vector>
  5. #include<stack>
  6. #define MAX_NODE_NUM 100
  7. using namespace std;
  8. int first[MAX_NODE_NUM];
  9. typedef struct EDGE{
  10. int u, v, w;
  11. int nextarc;
  12. EDGE(){
  13. }
  14. EDGE(int u, int v, int w, int nextarc){
  15. this->u = u;
  16. this->v = v;
  17. this->w = w;
  18. this->nextarc = nextarc;
  19. }
  20. } edge;
  21. vector<edge> g;
  22. stack<int> s, t;//s存储入度为零的节点, t存储图的拓扑序列的顶点栈
  23. int ve[MAX_NODE_NUM];//事件的最早发生时间, 或者 活动ai的最早发生时间
  24. int vl[MAX_NODE_NUM];//事件的最晚发生时间
  25. int degIn[MAX_NODE_NUM];//记录每一个节点的入度
  26. int tag[MAX_NODE_NUM][MAX_NODE_NUM];
  27. int n, m;//分别为图的节点的个数,和边的个数
  28. bool topoSort(){
  29. memset(ve, , sizeof(ve));
  30. int cnt = ;//记录
  31. for(int i=; i<=n; ++i)
  32. if(degIn[i] == )
  33. s.push(i);
  34. while(!s.empty()){
  35. int u = s.top();
  36. s.pop();
  37. t.push(u);
  38. ++cnt;
  39. for(int e=first[u]; ~e; e=g[e].nextarc){
  40. int v = g[e].v;
  41. int w = g[e].w;
  42. if(--degIn[v] == ) s.push(v);
  43. if(ve[u] + w > ve[v]) ve[v] = ve[u] + w;
  44. }
  45. }
  46. if(cnt < n) return false;//该有向图存在回路
  47. return true;
  48. }
  49. bool criticalPath() {//寻找关键路径
  50. if(!topoSort()) return false;
  51. for(int i=; i<=n; ++i)
  52. vl[i] = ve[t.top()];
  53. while(!t.empty()){//逆序拓扑排序,计算每个节点的最晚的发生时间
  54. int u = t.top();
  55. t.pop();
  56. for(int e=first[u]; ~e; e=g[e].nextarc){
  57. int v = g[e].v;
  58. int w = g[e].w;
  59. if(vl[v] - w < vl[u]) vl[u] = vl[v] - w;
  60. }
  61. }
  62. for(int i=; i<=n; ++i){//输出关节点
  63. int ee = ve[i];//活动ai的最早的发生时间
  64. for(int e=first[i]; ~e; e=g[e].nextarc) {
  65. int v = g[e].v;
  66. int w = g[e].w;
  67. int ll = vl[v]-w;//活动ai的最晚的发生时间
  68. ll == ee ? printf(" * ") : printf(" ");
  69. printf("%d %d %d %d %d\n", i, v, w, ee, ll);//分别为 u, v, w(这条边所对应的活动), 活动最早发生时间和最晚发生时间
  70. }
  71. }
  72. return true;
  73. }
  74. void dfs(int u){
  75. for(int e=first[u]; ~e; e=g[e].nextarc) {
  76. int ee = ve[u];
  77. int v = g[e].v;
  78. int w = g[e].w;
  79. dfs(v);
  80. if(tag[u][v]) continue;
  81. tag[u][v] = ;
  82. if(vl[v]-w < vl[u]) vl[u] = vl[v]-w;
  83. int ll = vl[v]-w;//活动au的最晚的发生时间
  84. ll == ee ? printf(" * ") : printf(" ");
  85. printf("%d %d %d %d %d\n", u, v, w, ee, ll);
  86. }
  87. }
  88. bool criticalPathx() {//寻找关键路径,利用dfs可以
  89. if(!topoSort()) return false;
  90. for(int i=; i<=n; ++i)
  91. vl[i] = ve[t.top()];
  92. dfs();//默认1节点为源点
  93. }
  94. void addEdge(int u, int v, int w){
  95. edge e(u, v, w, first[u]);
  96. first[u] = g.size();
  97. g.push_back(e);
  98. }
  99. int main(){
  100. printf("请输入图的节点的个数和边的个数:\n");
  101. scanf("%d%d", &n, &m);
  102. memset(first, -, sizeof(first));
  103. while(m--){
  104. int u, v, w;
  105. scanf("%d %d %d", &u, &v, &w);
  106. addEdge(u, v, w);
  107. ++degIn[v];
  108. }
  109. //criticalPath();
  110. /*输出结果:
  111. * 1 3 2 0 0
  112. 1 2 3 0 1
  113. 2 4 2 3 4
  114. 2 5 3 3 4
  115. 3 6 3 2 5
  116. * 3 4 4 2 2
  117. * 4 6 2 6 6
  118. 5 6 1 6 7
  119. */
  120. criticalPathx();
  121. /*输出结果:
  122. 3 6 3 2 5
  123. * 4 6 2 6 6
  124. * 3 4 4 2 2
  125. * 1 3 2 0 0
  126. 2 4 2 3 4
  127. 5 6 1 6 7
  128. 2 5 3 3 4
  129. 1 2 3 0 1
  130. */
  131. return ;
  132. }
  133. 输入数据:

6 8
1 2 3
2 5 3
5 6 1
2 4 2
4 6 2
3 4 4
1 3 2
3 6 3

  1.  

AOE网的关键路径的计算的更多相关文章

  1. AOE网与关键路径简介

    前面我们说过的拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间问题.如果我们要对一个流程图获得最短时间,就必须要分析它们的拓扑关系,并且找到当中最关键的流程, ...

  2. 基于AOE网的关键路径的求解

    [1]关键路径 在我的经验意识深处,“关键”二字一般都是指临界点. 凡事万物都遵循一个度的问题,那么存在度就会自然有临界点. 关键路径也正是研究这个临界点的问题. 在学习关键路径前,先了解一个AOV网 ...

  3. _DataStructure_C_Impl:AOE网的关键路径

    //_DataStructure_C_Impl:CriticalPath #include<stdio.h> #include<stdlib.h> #include<st ...

  4. AOE网与关键路径

    声明:图片及内容基于https://www.bilibili.com/video/BV1BZ4y1T7Yx?from=articleDetail 原理 AOE网 关键路径 数据结构 核心代码 Topo ...

  5. 教你轻松计算AOE网关键路径(转)

    原文链接:http://blog.csdn.net/wang379275614/article/details/13990163 本次结合系统分析师-运筹方法-网络规划技术-关键路径章节,对原文链接描 ...

  6. 教你轻松计算AOE网关键路径

    认识AOE网 有向图中,用顶点表示活动,用有向边表示活动之间开始的先后顺序,则称这种有向图为AOV网络:AOV网络可以反应任务完成的先后顺序(拓扑排序). 在AOV网的边上加上权值表示完成该活动所需的 ...

  7. 数据结构关于AOV与AOE网的区别

    AOV网,顶点表示活动,弧表示活动间的优先关系的有向图. 即如果a->b,那么a是b的先决条件. AOE网,边表示活动,是一个带权的有向无环图, 其中顶点表示事件,弧表示活动,权表示活动持续时间 ...

  8. AOV图与拓扑排序&AOE图与关键路径

    AOV网:所有的工程或者某种流程可以分为若干个小的工程或阶段,这些小的工程或阶段就称为活动.若以图中的顶点来表示活动,有向边表示活动之间的优先关系,则这样活动在顶点上的有向图称为AOV网. 拓扑排序算 ...

  9. AOE网络的关键路径问题

    关于AOE网络的基本概念可以参考<数据结构>或者search一下就能找到,这里不做赘述. 寻找AOE网络的关键路径目的是:发现该活动网络中能够缩短工程时长的活动,缩短这些活动的时长,就可以 ...

随机推荐

  1. [svg翻译教程]椭圆(ellipse元素)和线(line元素)

    line 先看个例子,这是svg中最简单的线 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http:/ ...

  2. 【SRM】518 Nim

    题意 \(K(1 \le K \le 10^9)\)堆石子,每堆石子个数不超过\(L(2 \le 50000)\),问Nim游戏中先手必败局面的数量,答案对\(10^9+7\)取模. 分析 容易得到\ ...

  3. ios设备中openGL所支持的最大纹理尺寸

    这几天碰到一个在iphone4上显示图片未黑色矩形的bug,在其他机器上都正常 最后发现是图片打包尺寸的关系,iphone4无法读取2048以上大小的单个图片,所以其中的图片都显示成了黑色,希望对碰到 ...

  4. Xamarin的不归路-生成安卓错误2

    错误提示: 解决方案:升级Andr​​oid sdk到Andr​​oid6.0即API23重新编译即可. Andr​​oid版本较低的手机如何使用? 你只需要编译和目标设定为6.0,根据需要设置最低A ...

  5. CSS外边距叠加问题

    CSS外边距叠加就是margin-collapse,边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距,水平边 距永远不会重合.重叠结果计算规则:①.两个相邻的外边距都是正数时,折叠结果是它 ...

  6. asp.net 基礎部分一

    过程: 客户端像服务器发送一个请求,iis服务器接收到请求的数据,并且将数据交给c#程序进行处理,并且对数据库进行操作,并且将处理到的结果响应给浏览器客户端 过程2:第一次浏览器请求,后端应该发一个表 ...

  7. HTML基础篇之内嵌框架和表单

    内嵌框架: <iframe src="http://www.baidu.com" name="d"></iframe> 网页会显示一个这 ...

  8. Response.StatusCode的HTTP状态代码列表

    1xx - 信息提示这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应. · 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分.( ...

  9. 微软发布TX(LINQ To Logs And Traces)

    微软开源技术公司于发布了Tx,这是一个Apache 2协议的开源项目,可以使用日志/跟踪文件辅助调试,以及创建实时监控和告警系统. 下面是几个引人关注的功能-- 允许在原始事件源上使用LINQ 允许在 ...

  10. UI控件(UIButton)

    @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // UIButtonTypeCustom = 0, ...