• 6 获取AOE网的关键路径--来源王英S同学


    来源王英S同学

    来源王英S同学

    来源王英S同学

    6 获取AOE网的关键路径

    作者: 冯向阳时间限制: 1S章节: 课程设计

    问题描述 :

    建立一个有向网AOE网,设计并完成一算法Get_CriticalPath(),获取关键路径。该路径仅输出,不须保存。

    提示:在AOE网中,

    (1)关键活动:开始时间余量为0的活动。即活动的最早开始时间等于它的最迟开始时间。 

    (2)根据各个顶点的Ve和Vl值,在求得每条弧s的最早开始时间e[s]和最迟开始时间l[s]后,若某条弧满足条件e[s]=l[s],该弧所对应的活动即为关键活动。

    (3)关键路径:由关键活动所形成的从源点到汇点的每一条路径(注意:关键路径可能有多条)。

    参考函数原型:

    //获取AOE网各顶点事件的最早发生时间ve和最迟发生时间vl、活动ak的最早开始时间e和最迟开始时间l、一条关键路径

    template

    bool adjlist_graph::Get_CriticalPath(int ve[], int vl[]);

    输入说明 :

    第一行:图的类型

    第二行:结点数

    第三行:结点集

    第四行:边数

    第五行:边集

    第六行:权集

    输出说明 :

    第一行:顶点集

    第二行:邻接表

    空行

    顶点i Ve[i] Vl[i](列与列之间用格式控制符'\t'分隔)

    ...

    空行

    <弧尾,弧头> e[k] l[k](列与列之间用格式控制符'\t'分隔)

    ...

    空行

    <弧尾,弧头>-><弧尾,弧头>...

    DN
    6
    A B C D E F
    8
    0 1
    0 2
    1 3
    1 4
    2 3
    2 5
    3 5
    4 5
    3 2 2 3 4 3 2 1

    --------------------

    A B C D E F
    A->2(2)->1(3)
    B->4(3)->3(2)
    C->5(3)->3(4)
    D->5(2)
    E->5(1)
    F

    A    0    0
    B    3    4
    C    2    2
    D    6    6
    E    6    7
    F    8    8

        0    0
        0    1
        3    4
        3    4
        2    5
        2    2
        6    6
        6    7

    (A,C)->(C,D)->(D,F)

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. using namespace std;
    9. const int maxn = 10010;
    10. struct node
    11. {
    12. int v,w; //记录上一个顶点 (有向边的下一个)顶点,边权
    13. };
    14. int b[10010]={0},c[10010]={0};
    15. char dian[10010];
    16. //拓扑序列,放在栈中,出栈就是逆拓扑排序
    17. stack<int>toporder;
    18. vectorG[maxn]; //邻接表存储的图
    19. int n,m,ve[maxn],vl[maxn],indegree[maxn]={0}; //n为顶点数,m为边数
    20. bool topologicalsort()
    21. {
    22. queue<int>q;
    23. for(int i = 0; i
    24. {
    25. if(indegree[i] == 0)
    26. {
    27. q.push(i);
    28. }
    29. }
    30. while(!q.empty())
    31. {
    32. int u = q.front();
    33. q.pop();
    34. toporder.push(u); //将u加入拓扑序列
    35. for(int i = 0; i size(); i++)
    36. {
    37. int v = G[u][i].v;
    38. indegree[v]--;
    39. if(indegree[v] == 0)
    40. {
    41. q.push(v);
    42. }
    43. if(ve[u] + G[u][i].w >ve[v])
    44. {
    45. ve[v] = ve[u] + G[u][i].w;
    46. }
    47. }
    48. }
    49. if(toporder.size() == n)
    50. return true;
    51. else
    52. return false;
    53. }
    54. int criticalpath()
    55. {
    56. memset(ve,0,sizeof(ve));
    57. if(topologicalsort() == false)
    58. {
    59. return -1;
    60. }
    61. fill(vl,vl+n,ve[n-1]); //vl数组初始化,初始值为汇点的ve值
    62. while(!toporder.empty()) //出栈,逆拓扑排序
    63. {
    64. int u = toporder.top();
    65. toporder.pop();
    66. for(int i = 0; i size(); i++)
    67. {
    68. int v = G[u][i].v;
    69. if(vl[v] - G[u][i].w
    70. {
    71. vl[u] = vl[v] - G[u][i].w;
    72. }
    73. }
    74. }
    75. for(int u=0;u
    76. {
    77. cout<'\t'<'\t'<
    78. }
    79. cout<
    80. //遍历邻接表的所有边,计算活动的最早开始时间e和最迟开始时间l
    81. for(int u = 0; u
    82. {
    83. for(int i = G[u].size()-1; i >=0; i--)
    84. {
    85. int v = G[u][i].v,w = G[u][i].w;
    86. int e = ve[u],l = vl[v] - w;
    87. cout<<'<'<','<'>'<<'\t'<'\t'<
    88. }
    89. }
    90. cout<
    91. int flag1=0,flag2=0;
    92. for(int u = 0; u
    93. {
    94. for(int i = 0; i size(); i++)
    95. {
    96. int v = G[u][i].v,w = G[u][i].w;
    97. int e = ve[u],l = vl[v] - w;
    98. if(e == l)
    99. {
    100. flag1++;
    101. }
    102. }
    103. }
    104. for(int u = 0; u
    105. {
    106. for(int i = 0; i size(); i++)
    107. {
    108. int v = G[u][i].v,w = G[u][i].w;
    109. int e = ve[u],l = vl[v] - w;
    110. if(e == l&&flag2-1)
    111. {
    112. cout<<'('<','<')'<<"->";
    113. flag2++;
    114. }
    115. else if(e == l&&flag2==flag1-1)
    116. {
    117. cout<<'('<','<')';
    118. }
    119. }
    120. }
    121. }
    122. int main()
    123. {
    124. string ss;
    125. cin>>ss;
    126. cin>>n;
    127. for(int i=0;i
    128. {
    129. cin>>dian[i];
    130. }
    131. cin>>m;
    132. int s,t,weight;
    133. for(int i = 0; i
    134. {
    135. cin>>b[i]>>c[i];
    136. }
    137. for(int i=0;i
    138. {
    139. cin>>weight;
    140. node pt; //用一个临时节点先存数据
    141. pt.w=weight;
    142. pt.v=c[i];
    143. G[b[i]].push_back(pt); //邻接表
    144. }
    145. for(int i = 0; i
    146. {
    147. for(int p=0;psize();p++)
    148. {
    149. indegree[G[i][p].v]++;
    150. }
    151. }
    152. for(int i=0;i-1;i++)
    153. {
    154. cout<' ';
    155. }
    156. cout<-1]<
    157. for(int i=0;i
    158. {
    159. if(G[i].size()!=0)
    160. {
    161. cout<"->";
    162. for(int p=G[i].size()-1;p>0;p--)
    163. cout<'('<')'<<"->";
    164. cout<0].v<<'('<0].w<<')'<
    165. }
    166. else
    167. {
    168. cout<
    169. }
    170. }
    171. cout<
    172. criticalpath();
    173. return 0;
    174. }

  • 相关阅读:
    第10章 游戏客户洞察案例实战
    SpringBoot集成-阿里云对象存储OSS
    ioctl接口笔记
    SkiaSharp 之 WPF 自绘 投篮小游戏(案例版)
    EMQX启用双向SSL/TLS安全连接以及java连接
    Linux:系统基本信息扫描(2)
    linux0.11-内核信号
    JAVA-GUI工具的编写-----简易框架篇
    Golang开发--互斥锁和读写锁
    MFC Windows 程序设计[334]之自定义编辑框(附源码)
  • 原文地址:https://blog.csdn.net/Ultravioletrays/article/details/126799760