寻找AOE网关键路径的代码实现

我们仍然一上一篇文章的图为例,把图附在下面

先把这个图输入我们的代码,由于我的代码是以邻接矩阵表示有向图,并从文件中读取矩阵数据,进而形成图的结构,所以,矩阵文件的内容如下

我在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。工作留给你自己

posted @ 2021-05-04 16:51  大神的老爸  阅读(269)  评论(0编辑  收藏  举报