我们仍然一上一篇文章的图为例,把图附在下面
先把这个图输入我们的代码,由于我的代码是以邻接矩阵表示有向图,并从文件中读取矩阵数据,进而形成图的结构,所以,矩阵文件的内容如下
我在gitee源代码的基础上实现
先看部分源代码
//计算节点的最早发生时间和最晚发生时间
for (int i = 0; i < graph._vertexs.size(); i++)
graph.vertexET(i);
for (int i = graph._vertexs.size() - 1; i >= 0; i--)
graph.vertexLT(i);
先正序计算每个节点的最迟发生时间,再倒序计算每个节点的最迟发生时间
下面是最早发生时间和最迟发生时间的代码,利用了我们上一篇随笔介绍的的计算公式
//关键路径查找,我们可以用节点数组,节点的_btime,_ftime存储节点的最早开始时间和最迟开始时间,
//同时构造一个边数组来存储活动的最早开始和最迟开始时间,显然,需要修改边的结构
//为了简化问题,我们假设输入的图已经是AOE图,不存在环。(关于是否存在环,可以修改_dfs代码,参考邓老师的算法)
void AdjMatrixGraph::vertexET(int index)
{
if (_vertexs.back()._btime == 0) //如果没有计算到最后一个节点的最早开始时间则执行计算,否则说明已经计算过了
{
if (index == 0)
{
_vertexs[index]._btime = 0;//第一个节点的lt和et相等,都是0
_vertexs[index]._ftime = 0;
}
else
{
//上一个邻接点的最短开始时间加他们之间活动的时间
int max = 0;
for (int i = 0; i < _vertexs.size(); i++)
{
if (_edgs[i][index] != 0)
{
int curValue = _vertexs[i]._btime + _edgs[i][index]->_weight;
if (curValue > max)
{
max = curValue;
}
}
}
_vertexs[index]._btime = max;
}
}
}
//计算index节点之后的节点最晚开始时间和边的差,并取最小值
void AdjMatrixGraph::vertexLT(int index)
{
if (_vertexs.back()._btime != 0) //最后一个节点的最早开始时间!=0,说明所有的节点最早开始时间都计算完毕
{
if (index == _vertexs.size() - 1)
{
_vertexs[index]._ftime = _vertexs[index]._btime;
}
else
{
// 下一个邻接点的最晚开始时间减他们之间活动的时间
int min = _vertexs.back()._ftime;
for (int i = 0; i < _vertexs.size(); i++)
{
if (_edgs[index][i] != 0)
{
int curValue = _vertexs[i]._ftime - _edgs[index][i]->_weight;
if (curValue <= min)
{
min = curValue;
}
}
}
_vertexs[index]._ftime = min;
}
}
这个代码如果没问题,可以自己试着写边的lt和et。工作留给你自己
原文:https://www.cnblogs.com/svod5306/p/14729795.html