有向圖是描述工程進行過程的有效工具,幾乎全部的工程均可以分爲若干個「活動」的子工程,每一個活動都會持續一段時間,某些活動之間每每存在必定的約束關係,好比某些活動的開始必須在某些特定活動的結束才能夠運行。
下面對於有向圖咱們進行拓撲排序和關鍵路徑的討論。web
在一個表示工程的有向圖中,用頂點表示活動,用弧表示活動之間的優先關係,稱這樣的有向圖爲頂點表示活動的網,簡稱AOV網(activity on vertex network),顯然,AOV網中不能出現迴路,不然意味着某項活動的開始要以本身的完成做爲先決條件,這顯然是不成立的。所以判斷AOV網可否正常進行即判斷它是否存在迴路。測試AOV網是否存在迴路的方法就是對AOV網進行拓撲排序。svg
拓撲序列:設G=(V,E)是一個有向圖,V的頂點序列v0,v1,…vn-1稱爲一個拓撲序列當且僅當知足如下條件:若從頂點vi到vj有一條路徑,則在頂點序列中vi必須存在於vj以前。
對一個有向圖構造拓撲序列的過程稱爲拓撲排序。(不惟一)
過程:工具
for{ 找出入度爲0(沒有前驅)的頂點輸出; 刪除(模擬刪除)該點和該點引出的邊; }
在一個表示工程的帶權有向圖中,用頂點表示事件,用有向邊表示活動,邊上的權值表示活動的持續時間,稱這樣的有向圖爲邊表示活動的網,簡稱AOE網(activity on edge network),AOE網中沒有入邊的頂點稱爲源點,沒有出邊的頂點稱爲終點。測試
1.只有在進入某頂點的各活動都已經結束,該頂點所表明的事件才能開始發生。
2.只有某頂點所表明的事件發生後,從該頂點出發的各個活動才能開始。
由AOE網的性質知:完成整個工程所需的時間應該爲始點到終點的最大路徑長度(這裏的最大路徑長度是指該路徑上的各個活動所持續的時間之和)。具備最大路徑長度的路徑稱爲關鍵路徑(critical path),關鍵路徑上的活動稱爲關鍵活動(critical activity),關鍵路徑長度是整個工程所需的最短工期,也就是說,要想縮短整個工期,必須加快關鍵活動的進度。spa
(ve[k]是指從源點到頂點vk的最大路徑長度,這個長度決定了全部從頂點vk發出的活動能夠開始的最先時間)
ve[0]=0;
ve[k]=max{ve[j]+length<vj,vk>}(<vi,vj>屬於p[k])(p[k]表示全部到達vk的有向邊的集合,len<vj,vk>爲有向邊<vi,vj>的權值)code
(vl[k]是指在不推遲整個工期的前提下,時間vk容許的最晚發生時間)
vl[n-1]=ve[n-1]
vl[k]=min{vl[j]-len<vk,vj>}xml
(活動ai的最先開始時間應等於事件vk的最先發生時間。)
ee[i]=ve[k]排序
(e[i]是指在不推遲整個工期的前提下麼活動ai必須開始的最晚時間。)
el[i]=vl[j]-len<vi,vj>token
根據每一個活動的最先開始時間ee[i]和最晚開始時間el[i]斷定活動是否爲關鍵活動:當ee[i]=el[i]的活動就是關鍵活動,那些el[i]>ee[i]的活動則不是關鍵活動,el[i]-ee[i]的值爲活動的時間餘量,關鍵活動肯定以後,關鍵活動所在的路徑就是關鍵路徑。事件
AOV{ 頂點->活動; 弧/邊->活動間優先關係; } AOE{ 頂點->事件; 弧/邊->活動,邊上的權值表示活動的持續時間; }