關鍵路徑 CriticalPath演算法

2022-05-18 04:59:59 字數 1708 閱讀 8663

關鍵路徑:

即決定一項工程的完成時間的路徑。

如下圖所示,是一輛汽車的生產流程,其中外殼、發動機、輪子等的生產過程都是可以並行進行的,但是傳送機生產需要的時間最長,而只有所有零部件生產完成才才能進行下一步,因此圖中用紅色加粗的那一條路徑即為該工程的關鍵路徑(即決定工程的實際完成時間的路徑)。

criticalpath演算法理解:

此演算法是在拓撲排序的基礎上進行的,首先對aoe圖完成拓撲排序,並將排序結果儲存在棧中(**中是棧stack2)。

在拓撲排序完成之後,計算各個事件(頂點)、活動(弧)的etv、ltv、ete、lte的值。

其中lte = ete的活動(弧)即為關鍵活動,關鍵活動連線成為關鍵路徑。

**如下:(有詳細注釋)(較容易理解)

/* 弧 edge */

typedef struct edgenode

edgenode;

/* 頂點 node */

typedef struct vertexnode

vertexnode, adjlist[maxvex];

/* 鄰接表 */

typedef struct

graphadjlist, *graphadjlist;

int *etv, *ltv;

int *stack2; // 用於儲存拓撲序列的棧

int top2; // stack2的棧頂指標

/* 拓撲排序演算法 */

/* 若gl無迴路 則輸出拓撲排序序列並返回ok 否則返回error */

/* 拓撲排序僅改變這些頂點的排列順序(這裡是按順序存放在stack2中) 而並不改變頂點之間的連線關係 */

status topologicalsort(graphadjlist gl)

} top2 = 0;

etv = (int *)malloc(gl->numvertexes*sizeof(int));

/* 初始化etv都為0 */

for( i=0; i < gl->numvertexes; i++ )

stack2 = (int *)malloc(gl->numvertexes*sizeof(int));

/* 拓撲排序 */

while( 0 != top )

/* 如果某乙個頂點有多個入度 則該事件需要等待這幾個活動都完成才能有效 */

/* 故這裡判斷如果有更長的路徑 則替代原本的etv */

if( (etv[gettop]+e->weight) > etv[k] )

}} /* 如果count小於頂點數 說明存在環 */

if( count < gl->numvertexes )

else }

/* 求關鍵路徑 */

/* gl為有向圖 輸出gl的各項關鍵活動 */

void criticalpath(graphadjlist gl)

/* 從匯點倒推計算ltv */

while( 0 != top2 )

}} /* 通過etv和ltv 求ete和lte */

for( j=0; j < gl->numvertexes; j++ )}}}

——cloud over sky

——2020/3/12

Codeup關鍵路徑 關鍵路徑

時間限制 1 sec 記憶體限制 128 mb 提交 261 解決 90 提交 狀態 討論版 命題人 外部匯入 描述 圖的連線邊上的資料表示其權值,帶權值的圖稱作網。上圖可描述為頂點集為 a,b,c,d,e 邊集及其權值為 始點,終點 權值 a b 3 a c 2 b d 5 c d 7 c e 4...

關鍵路徑法

關鍵路徑法 critical path method,cpm 又稱為要徑法,是計畫專案活動中用到的一種算術方法。1 對於有效的計畫管理而言,關鍵路徑是乙個十分重要的工具。與計畫評核術 project evaluation and reviewtechniqu,pert 非常類似。要徑法所使用的估計作...

關鍵路徑法

aoe網 在乙個表示工程的帶權有向圖中,用頂點表示事件,用有向邊表示活動,邊上的權值表示活動的持續時間,稱這樣的有向圖叫做邊表示活動的網,簡稱aoe網。aoe網中沒有入邊的頂點稱為始點 或源點 沒有出邊的頂點稱為終點 或匯點 aoe網的性質 只有在某頂點所代表的事件發生後,從該頂點出發的各活動才能開...