aoe网最早开始时间和最迟开始时间_AOE网活动的最早、最迟发生时间及关键路径问题...

e85db4f4457e2aace62ccbb98024abd5.png

我抄我自已嘿嘿,原文地址(CSDN):

AOE网活动的最早、最迟发生时间及关键路径问题_WaneGi没有故事-CSDN博客_aoe网最早开始时间和最迟开始时间​blog.csdn.net
779dbc043a7f0270c9c974b580c0ca2f.png

有疑问可以在评论区交流,,

e8b0a9c6f4f7cea0b1a4366833291e4f.png

5474a1b9ebf7eab7785789e142a9cde9.png

d2fc35ba66c351a9151039007215880b.png

25ecb26fc5dabb98e7e3975893dddc76.png

以下为原文:


有向图中,用顶点表示事件,用有向边表示活动之间开始的先后顺序,则称这种有向图为AOV(Activity On Vertex)网络;AOV网络可以反应任务完成的先后顺序(拓扑排序)。

在AOV网的边上加上权值表示完成该活动所需的时间,则称这样的AOV网为AOE(Activity On Edge)网,如图: 

5ef5eae9d9ce2c14d78c324f6511c970.png

如何求AOE网中各事件(节点)和各活动(边)的最早开始时间和最迟开始时间以及工程的关键路径?

整个活动的完成时间是AOE图中从始点到终点的最长路径的长度,这条路径称为关键路径。关键路径上的活动称作关键活动。

注意:关键路径不一定只有一条。

1.最早发生时间:从前往后,前驱结点到当前结点所需时间,取最大值。

如上图中的节点4有两个前驱结点(节点2和3),节点2到节点4的最早发生时间是a1+a3也就是8,节点3到节点4的最早发生时间是a2+a4也就是12,因为12>8,所以节点4的最早发生时间是12.

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

结束节点(10)的最早发生时间和最迟发生时间相同。

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

2.最迟发生时间:从后往前,后继结点的最迟发生时间-边权值,取最小值。

如上图中的节点9的最迟发生时间为其后继节点10(只有一个)的最迟发生时间减去a14即24-2=22.

3ae93a4f2f0114cdb619e4304fbc1d74.png
知乎不支持8列以上的表格展示,故这里用了截图

3.关键路径:最早发生时间和最迟发生时间相同的结点即为关键路径上的节点。

8e2c5387df5411d30662ddf3458cc530.png

be7e2c537ab7aa10fcab90a6b6ddb12a.png

4.最早开始时间:等于当前边起始结点的最早发生时间。

5.最晚开始时间:等于当前边指向结点的最迟发生时间-当前边的权值。

6.最早完工时间:等于当前边指向结点的最早发生时间。

7.最晚完工时间:等于当前边指向结点的最迟发生时间。

e29ca1128962c2ace644894073cf8916.png

点个赞❤️呗!

a9c113de8e1028236c2858957d5299fc.png
  • 52
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较具体的问题。在C++中生成AOE,可以使用图论中的邻接表或邻接矩阵来表示。然后,可以使用拓扑排序算法来求出每个事件的最早开始时间最早发生时间,以及确认关键路径。 以下是一个简单的C++代码示例,用于生成AOE和计算关键路径: ```c++ #include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; const int N = 10010; struct Edge { int to; int weight; int next; } edge[N]; int head[N]; int cnt = 0; int n, m; int in_degree[N]; int earliest_time[N]; int latest_time[N]; bool is_critical[N]; void addEdge(int u, int v, int w) { edge[++cnt].to = v; edge[cnt].weight = w; edge[cnt].next = head[u]; head[u] = cnt; } void init() { memset(head, -1, sizeof(head)); memset(in_degree, 0, sizeof(in_degree)); memset(earliest_time, 0, sizeof(earliest_time)); memset(latest_time, 0x3f, sizeof(latest_time)); memset(is_critical, false, sizeof(is_critical)); cnt = 0; } void topoSort() { queue<int> que; for (int i = 1; i <= n; i++) { if (in_degree[i] == 0) { que.push(i); earliest_time[i] = 0; } } while (!que.empty()) { int u = que.front(); que.pop(); for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; int w = edge[i].weight; in_degree[v]--; earliest_time[v] = max(earliest_time[v], earliest_time[u] + w); if (in_degree[v] == 0) { que.push(v); } } } } void calcLatestTime() { queue<int> que; for (int i = 1; i <= n; i++) { if (in_degree[i] == 0) { que.push(i); latest_time[i] = earliest_time[n]; } } while (!que.empty()) { int u = que.front(); que.pop(); for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; int w = edge[i].weight; in_degree[v]--; latest_time[u] = min(latest_time[u], latest_time[v] - w); if (in_degree[v] == 0) { que.push(v); } } } } void calcCritical() { for (int i = 1; i <= n; i++) { if (earliest_time[i] == latest_time[i]) { is_critical[i] = true; } } } int main() { cin >> n >> m; init(); for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; addEdge(u, v, w); in_degree[v]++; } topoSort(); calcLatestTime(); calcCritical(); cout << "每个事件的最早开始时间:\n"; for (int i = 1; i <= n; i++) { cout << earliest_time[i] << " "; } cout << endl; cout << "每个事件的最晚开始时间:\n"; for (int i = 1; i <= n; i++) { cout << latest_time[i] << " "; } cout << endl; cout << "每个事件的最早发生时间:\n"; for (int i = 1; i <= n; i++) { cout << earliest_time[i] << " "; } cout << endl; cout << "每个事件的最晚发生时间:\n"; for (int i = 1; i <= n; i++) { cout << latest_time[i] << " "; } cout << endl; cout << "关键活动:\n"; for (int i = 1; i <= cnt; i++) { int u = edge[i].to; int v = i; int w = edge[i].weight; if (is_critical[u] && earliest_time[u] + w == earliest_time[v] && latest_time[u] == latest_time[v] - w) { cout << u << " -> " << v << endl; } } return 0; } ``` 这段代码中,我们使用邻接表来表示图,使用拓扑排序算法求出每个事件的最早开始时间最早发生时间,然后使用反向拓扑排序和计算最晚开始时间和最晚发生时间。最后,判断每个活动是否是关键活动,输出关键路径。 希望这个代码示例可以帮到您!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值