不存在有向環路的有向圖稱為無環路有向圖。無環有向圖可用於表示偏序集。設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圖表示乙個工程,其中有向邊表...