最长的路径
AOE网
本质也是有向图,边表示活动,顶点表示事件,权值表示耗时。工程中一般只有一个源点一个汇点(入度为0的就是源点,出度为0的就是汇点)
ETV
事件的最早发生时间从源点开始计算(前置条件都完成了事件才能开始)
LTV
事件最晚发生时间,如果超出这个时间就会延误工期
ETE
活动的最早开始时间,就是活动前的事件的最早开始时间
LTE
活动的最晚开始时间,如果超出这个时间就会影响下一个事件的开始从而延误工期
算法步骤
- 利用拓扑排序求得ETV(0入度退栈,遍历邻接结点,将每个节点对应事件最早发生时间etv更换)
- 根据事件的最早发生时间ETV推断事件的最晚发生时间LTV(初始化为汇点etv,出栈点ltv = 邻接结点ltv - 边权重)
- 用事件的最早发生时间和最晚发生时间计算出活动的最早与最晚发生时间(ETE = etv,lte = 邻接点ltv - 边权重)
- 关键路径上的活动(边),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);
}
}
}
}

被折叠的 条评论
为什么被折叠?



