AOE网与拓扑排序紧密联系。如果你还不了解拓扑排序可来此看一下 拓扑排序.
关键路径:是指路径长度最长的路径
图中每个点代表事件,而边代表活动。在AOE网中先采用拓扑排序进行预处理。然后根据拓扑排序对每个点进行处理,求出他们的ve(最早开始时间)和vl(最晚开始时间)。最后对每个边(活动)进行求最早开始时间和最晚开始时间,若两者相等,则为关键活动。
ve的求法
顺序遍历拓扑排序,ve(k)为到当前结点k的所有路径的最大值
vl求法
逆序遍历拓扑排序,vl(k)为逆序遍历到当前结点的所有路径的最小值
关键活动的最早开始时间 e和最晚开始时间 l
对于每一个活动(每一条边),不妨设起点为u,终点为v。则e=ve(u),l=vl(v)-w;其中w为边的权值
代码如下
/*
* @Author: csc
* @Date: 2020-12-13 14:20:02
* @LastEditTime: 2020-12-17 20:22:01
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \code\aoe.h
*/
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int aoe_in[100], ve[100], vl[100];
int _map[100][100];
struct aoe_node
{
int to, w;
aoe_node(int a, int b) : to(a), w(b) {
}
};
vector<aoe_node> aoe[100];
int n, m;
string tuopu = "";
void _tp()
{
queue<int> q;
for (int i = 1; i <= n; ++i)
{
if (!aoe_in[i])
q.push(i), tuopu += (char)(i);
}
while (!q.empty())
{
int u = q.front(