拓撲排序主要是為解決乙個工程能否順序進行的問題,但有時我們還需要解決工程完成需要的最短時間問題。
我們把路徑上各個活動所持續的時間之和稱為路徑長度,從源點到匯點具有最大長度的路徑叫關鍵路徑,在關鍵
路徑上的活動叫關鍵活動。
關鍵路徑演算法基於拓撲排序演算法,這裡直接上**,以後有機會再詳解。
class edgenode
}class vertexnode
}class graph
}$edgenode0 = new edgenode(2, 4, new edgenode(1, 3));
$edgenode1 = new edgenode(4, 6, new edgenode(3, 5));
$edgenode2 = new edgenode(5, 7, new edgenode(3, 8));
$edgenode3 = new edgenode(4, 3);
$edgenode4 = new edgenode(7, 4, new edgenode(6, 9));
$edgenode5 = new edgenode(7, 6);
$edgenode6 = new edgenode(9, 2);
$edgenode7 = new edgenode(8, 5);
$edgenode8 = new edgenode(9, 3);
$edgenode9 = null;
$adjlist = array(
new vertexnode(0, 'v0', $edgenode0),
new vertexnode(1, 'v1', $edgenode1),
new vertexnode(1, 'v2', $edgenode2),
new vertexnode(2, 'v3', $edgenode3),
new vertexnode(2, 'v4', $edgenode4),
new vertexnode(1, 'v5', $edgenode5),
new vertexnode(1, 'v6', $edgenode6),
new vertexnode(2, 'v7', $edgenode7),
new vertexnode(1, 'v8', $edgenode8),
new vertexnode(2, 'v9', $edgenode9),
);$graph = new graph($adjlist, 10);
//----------------------- 第一種 ------------------------------------
$etv = array_fill(0, 10, 0);
$stacktop = $stacktop2 = -1;
$count = 0;
$stack = $stack2 = array();
foreach ($graph->adjlist as $adjkey => $adjitem)
}while ($stacktop != -1)
if (($etv[$gettop] + $e->weight) > $etv[$k]) }}
//關鍵路徑
$ltv = array_fill(0, $graph->num, $etv[$graph->num - 1]);
while ($stacktop2 != 0) }}
for ($j = 0; $j < $graph->num; $j++) }}
if ($count < $graph->num) else
經典演算法之關鍵路徑
設乙個工程有11項活動,9個事件,事件v1 表示整個工程開始,事件v9 表示整個工程結束。每個事件的開始必須是它之前的活動已完成。例如 事件v2,v3,v4的開始必須是活動a1,a2,a3完成了。這時我們會關注兩個問題 1 完成整個專案需要多少時間?2 哪些活動是影響工程進度的關鍵?關鍵路徑 aoe...
關鍵路徑 CriticalPath演算法
關鍵路徑 即決定一項工程的完成時間的路徑。如下圖所示,是一輛汽車的生產流程,其中外殼 發動機 輪子等的生產過程都是可以並行進行的,但是傳送機生產需要的時間最長,而只有所有零部件生產完成才才能進行下一步,因此圖中用紅色加粗的那一條路徑即為該工程的關鍵路徑 即決定工程的實際完成時間的路徑 critica...
關鍵路徑 CriticalPath演算法
關鍵路徑 即決定一項工程的完成時間的路徑。如下圖所示,是一輛汽車的生產流程,其中外殼 發動機 輪子等的生產過程都是可以並行進行的,但是傳送機生產需要的時間最長,而只有所有零部件生產完成才才能進行下一步,因此圖中用紅色加粗的那一條路徑即為該工程的關鍵路徑 即決定工程的實際完成時間的路徑 critica...