关键路径求解要用到拓扑排序,先从头往后拓扑,在ve[i]中记录每个事件的最早发生时间。
然后把ve[]的值赋给vl[],从后边向前求每个事件的最迟发生时间,记录在vl[]中。
如果ve[]中的值和vl[]中的值对应相等,则这个事件在关键路径上。
假设初始AOE网是这样的:
关键路径:
代码:
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
int map[101][101];
int indegree[101];
int indegreeCopy[101];
int n,m;
int ve[101];//事件V的最早发生时间
int vl[101];//事件V的最迟发生时间
bool criticalPath()
{
//forward
ve[1]=0;
queue<int> Q;
stack<int>S;
int nodeCount=0;
for(int i=1; i<=n; i++)
{
if(!indegree[i])
{
Q.push(i);//入度为0的顶点进队