拓撲排序和關鍵路徑

2022-08-01 10:39:10 字數 1715 閱讀 1813

不存在有向環路的有向圖稱為無環路有向圖。無環有向圖可用於表示偏序集。設r是有窮集合x上的偏序關係,對x的每個v,用乙個以v為標號的頂點表示,由此構成頂點集v。對r中任意乙個序對(a,b),a不等於b,由對應的兩個頂點建立一條邊(a,b),由此構成邊集e,則g=(v,e)是無環路有向圖。

下面介紹由廣度優先搜尋演算法演變而得到的拓撲排序演算法。

**如下:

//輸入為鄰接表

void topoorder(graph l)

}if(nodecount < n)

cout << "you huan lu a!";

}

2.1 概念

在引進「關鍵路徑」這個詞之前,先介紹一下與它密不可分的幾個概念。如果在帶權的有向圖中,用頂點表示事件,邊表示活動,權表示活動持續的時間。把這樣的有向圖稱為關於邊的活動網。與之相對應,若用頂點表示活動,用邊表示活動的先後順序關係,這樣的有向圖稱為關於頂點的活動網,例如拓撲圖。將這些活動網統稱為aoe網

事件v5表示活動a4和a5已結結束,a7和a8可以開始。邊上的數字為持續的時間。

顯然,在aoe網中,由於有些活動可以同時進行,所以完成工程最小時間是從起始點到結束點最長路徑的長度,把從起始點到結束點具有最大長度的路徑稱為關鍵路徑。圖中的a1-a4-a7-a10(長為18)就是其中一條關鍵路徑。關鍵路徑的長度代表完成這個工程最少需要的時間。這裡需要注意,活動的時間只是指完成該活動的最少時間,實際上可能會拖延什麼的。

從aoe網的起始點v1到其中某一頂點vi的最長路徑的長度,稱為事件vi的最早發生時間,記為ve[i]。如事件v5的最早發生時間為7。

用e(i)表示活動ai的最早開始時間。事件vi的最早發生時間決定了以vi為起點的所有邊上的活動的最早開始時間。如e(7)=e(8)=事件v5的最早發生時間=7。

對於活動ai,還定義乙個最遲開始時間,它是不使整個工程的完成時間拖延的最晚開始時間。用l(i)表示。如,l(6)=18-a11-a9-a6=8。

對於事件vi,也有乙個最遲發生時間vl[i]。

關鍵路徑上,所有活動都滿足e(i) = l(i),把滿足這一等式的所有活動稱為關鍵活動

活動ai的最遲開始時間和最早開始時間之差表示ai的完成時間餘量,即允許ai延緩的時間。

2.2 尋找關鍵活動

求解關鍵活動在於求解e(i)和l(i)。

設活動ai所對應的邊為(k,m),並且用act[k][m]來表示乙個活動的持續時間,很明顯:

e(i) = ve[k] 或者用e(k,m)

l(i) = vl[m] - act[k][m] 或者用l(k,m)

現在就轉化為求解ve[i]和vl[i],分成兩步:

回退階段:從已求出的vl[n]=ve[n]開始,沿著路徑上每條邊的相反方向,應用如下公式:

vl[k] = min,m為k的直接後續頂點

可以用類似拓撲排序的演算法求出l[i]和e[i],對於這兩者都相等的活動則是關鍵活動,將所有非關鍵活動刪除後得到的圖,任意一條路徑都是關鍵路徑。

拓撲排序和關鍵路徑

拓撲排序 乙個無環的有向圖稱為無環圖 directed acyclic graph 簡稱dag圖。所有的工程或者某種流程都可以分為若干個小的工程或者階段,稱這些小的工程或階段為 活動 這些子程式之間存在一定的約束,其中某種子工程的開始必須在另一些子工程完成之後。因此dag圖表示乙個工程,其中有向邊表...

拓撲排序和關鍵路徑

文章出自 拓撲排序和關鍵路徑 拓撲排序 拓撲排序最大的用途就是判斷乙個有向圖是否有環,當然判斷還有一種方法就是floyd演算法。如果用鄰接表的話拓撲排序的時間複雜度是o n e 鄰接矩陣是o n 2 n表示頂點數,e表示邊數,floyd時間複雜度是o n 3 拓撲排序方法可分為無前趨的頂點優先的拓撲...

拓撲排序和關鍵路徑

拓撲排序 乙個無環的有向圖稱為無環圖 directed acyclic graph 簡稱dag圖。所有的工程或者某種流程都可以分為若干個小的工程或者階段,稱這些小的工程或階段為 活動 這些子程式之間存在一定的約束,其中某種子工程的開始必須在另一些子工程完成之後。因此dag圖表示乙個工程,其中有向邊表...