关键路径(逻辑加代码)

最长的路径

AOE网

本质也是有向图,边表示活动,顶点表示事件,权值表示耗时。工程中一般只有一个源点一个汇点(入度为0的就是源点,出度为0的就是汇点)

ETV

事件的最早发生时间从源点开始计算(前置条件都完成了事件才能开始)

LTV

事件最晚发生时间,如果超出这个时间就会延误工期

ETE

活动的最早开始时间,就是活动前的事件的最早开始时间

LTE

活动的最晚开始时间,如果超出这个时间就会影响下一个事件的开始从而延误工期

算法步骤

  1. 利用拓扑排序求得ETV(0入度退栈,遍历邻接结点,将每个节点对应事件最早发生时间etv更换)
  2. 根据事件的最早发生时间ETV推断事件的最晚发生时间LTV(初始化为汇点etv,出栈点ltv = 邻接结点ltv - 边权重)
  3. 用事件的最早发生时间和最晚发生时间计算出活动的最早与最晚发生时间(ETE = etv,lte = 邻接点ltv - 边权重)
  4. 关键路径上的活动(边),ETE等于LTE
public void criticalPath(){
        topology(graphAdjList);
        //初始化最晚事件发生时间
        for (int i = 0; i < graphAdjList.vNums;i++){
            ltv[i] = etv[etv.length - 1];
        }
        while(!topoStack.isEmpty()){
            Vert v = topoStack.pop();
            int tempt = getIndex(v);//出栈元素下标
            for(Edge e = v.firstEdge;e!= null;e = e.next){
                int edgIndex = e.index;//边对应事件的下标
                //更新最晚事件时间
                if(ltv[tempt] > ltv[edgIndex] - e.weight){
                    ltv[tempt] = ltv[edgIndex] - e.weight;
                }
            }

        }
        //利用etv和ltv计算ete和lte
        for (int i = 0; i < graphAdjList.vNums; i++) {
            for (Edge e = graphAdjList.verts[i].firstEdge;e != null;e = e.next) {
                ete = etv[i];
                lte = ltv[e.index] - e.weight;
                if(ete == lte){
                    System.out.println("<" + graphAdjList.verts[i].data + "," + graphAdjList.verts[e.index].data + ">" + e.weight);
                }
            }
        }
    }

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值