關鍵路徑 C語言簡單實現

2021-10-10 16:35:39 字數 3450 閱讀 2669

本文參考自《大話資料結構》,對關鍵路徑的理解參考自:

在乙個表示工程的帶權有向圖中,用頂點表示事件,用有向邊表示活動,用邊上的權值表示活動的持續時間,這種有向圖的邊表示活動的網,我們稱之為aoe。我們把aoe網中沒有入邊的頂點稱為始點或源點,沒有出邊的頂點稱為終點或匯點。

儘管aoe網和aov網都是用來對工程建模的,但它們還是有很大的不同,主要體現在aov網是頂點表示活動的網,只描述活動之間的制約關係,而aoe網是用邊表示活動的網,邊上的權值表示活動持續的時間。

​ 為了講清楚求關鍵路徑的演算法,我還是來舉個例子。假設乙個學生放學回家,除掉吃飯、洗漱外,到睡覺前有四小時空閒,而家庭作業需要兩小時完成。不同的學生會有不同的做法,抓緊的學生,會在頭兩小時就完成作業,然後看看電視、讀讀課外書什麼的;但也有超過一半的學生會在最後兩小時才去做作業,要不是因為沒時間,可能還要再拖延下去。

​ 這裡做家庭作業這活動的最早開始時間是四小時的開始,可以理解為0,而最晚開始時間是兩小時之後馬上開始,不可以再晚,否則就是延遲了,此時可以理解為2。顯然,當最早和最晚開始時間不相等時就意味著空閒。

​ 接著,你老媽發現了你拖延的小秘密,於是買了很多的課外習題,要求你四個小時,不許有一絲空閒,省得你拖延或偷懶。此時整個四小時全部被佔滿,最早開始時間和最晚開始時間都是0,因此它就是關鍵活動了。

也就是說,我們只需要找到所有活動的最早開始時間和最晚開始時間,並且比較它們,如果相等就意味著此活動是關鍵活動,活動間的路徑為關鍵路徑。如果不等,則就不是。

我們把路徑上各個活動所持續的時間之和稱為路徑長度,從源點到匯點具有最大長度的路徑叫關鍵路徑,在關鍵路徑上的活動叫關鍵活動

幾個關鍵引數

事件的最早發生時間etv:即頂點vk的最早發生時間;

事件的最晚發生時間ltv:即頂點vk的最晚發生時間,也就是每個頂點對應的事件最晚需要開始的時間,超出此時間將會延誤整個工期;

活動的最早開工時間ete:即弧ak的最早發生時間;

活動的最晚開工時間lte:即弧ak的最晚發生時間,也就是不推遲工期的最晚開工時間。

可以由1和2求的3和4,然後再根據ete[k]是否與lte[k]相等來判斷ak是否是關鍵活動

與拓撲排序時鄰接表結構不同的地方在於,弧鍊錶增加了weight域,用來儲存弧的權值。

求事件的最早發生時間etv的過程,就是我們從頭到尾找拓撲的過程,因此,在求關鍵路徑之前,需要先呼叫一次拓撲序列演算法的**來計算etv和拓撲序列列表。為此,我們先在程式開始處宣告幾個全域性變數。

int

*etv,

*ltv;

//事件最早發生時間和最遲發生時間陣列

int*stack2;

//用於儲存拓撲序列的棧

int top2;

//用於stack2的指標

下面是改進過的求拓撲序列演算法:

status topologicalsort

(graphadjlist gl)}if

(count < gl->numvertexes)

return error;

else

return ok;

}

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

void

criticalpath

(graphadjlist gl)

}for

(j=0

;jnumvertexes;j++)}

}

演算法複雜度o(n+e)

實踐證明,通過這樣的演算法對工程的前期工期估算和中期的計畫調整都有很大的幫助。不過注意,本例是唯一一條關鍵路徑,如果是多條關鍵路徑,那麼單單提高一條關鍵路徑上的關鍵活動的速度並不能導致整個工程縮短工期,而必須提高同時在幾條關鍵路徑上的活動的速度。

例子的圖和資料,以及對關鍵路徑的理解都參考自:

;/* 圖初始化 */

void

creategraph

(graph* g)

//初始化圖頭結點指標和入度值

for(i=

0;inumvertexes;i++

)printf

("輸入邊和權值:\n");

for(i=

0;inumedges;i++)}

/* 拓撲排序 */

bool topologicalsort

(graph* g,

int* etv,

int* stack2)

top2 =0;

for(i=

0;inumvertexes;i++

) etv[i]=0

;//初始化為0

while

(top)}if

(count == g->numvertexes)

return true;

else

return false;

}/* 關鍵路徑 */

關鍵路徑 C語言實現

include include define maxvertexnum 50 define false 0 define true 1 typedef int bool typedef int vertex typedef int weighttype struct vertexnode 頂點結構 ...

C語言實現「關鍵路徑」的求解

儘管是用c 編譯的,但程式中沒有應用什麼c 特性,應該算是c語言編寫吧。一 概述 工程上常常用乙個有向無環圖來代表乙個專案 如下圖 以節點表示某個事件,以邊表示活動,邊上的數字表示活動的持續時間。在工程分析上,常常需要找到一條 關鍵路徑 即此路徑直接決定專案的持續時間。二 演算法描述 為求出關鍵路徑...

串 C語言簡單實現

本文參考自 大話資料結構 串是由零個或多個字元組成的有限序列,又名叫字串。adt 串 string data 串中元素僅由乙個字元組成,相鄰元素具有前驅和後繼關係。operation strassign t,chars 生成乙個其值等於字串常量chars的串t strcopy t,s 串s存在,由串...