乙個無環的有向圖稱為無環圖(directed acyclic graph),簡稱dag圖。
在乙個表示工程的有向圖中,用頂點表示活動,用弧表示活動之間的優先關係,這樣的有向圖為頂點表示活動的網,我們稱之為aov網(active on vertex network)。
aov網不能存在迴路!
拓撲序列:設g=(v,e)是乙個具有n個頂點的有向圖,v中的頂點序列v1,v2,……,vn滿足若從頂點vi到vj有一條路徑,則在頂點序列中頂點vi必在頂點vj之前。則我們稱這樣的頂點序列為乙個拓撲序列。
拓撲排序:所謂的拓撲排序,其實就是對乙個有向圖構造拓撲序列的過程。
假設有
這個表轉換為
aov網是這樣子:
可以得到拓撲序列(其中一種):1,13,4,8,14,15,5,2,3,10,11,12,7,6,9
•對aov網進行拓撲排序的方法和步驟如下:
–從aov網中選擇乙個沒有前趨的頂點(該頂點的入度為0)並且輸出它;
–從網中刪去該頂點,並且刪去從該頂點發出的全部有向邊;
–重複上述兩步,直到剩餘網中不再存在沒有前趨的頂點為止。
用鄰接表(因為需要刪除頂點,所以我們選擇鄰接表會更加方便)資料結構表示:其中in是入度,下標代表上面的標記-1
// 邊表結點宣告
typedef struct edgenode
edgenode;
// 頂點表結點宣告
typedef struct vertexnode
vertexnode, adjlist[maxvex];
typedef struct
graphadjlist, *graphadjlist;
// 拓撲排序演算法
// 若gl無迴路,則輸出拓撲排序序列並返回ok,否則返回error
status topologicalsort(graphadjlist gl) }
while( 0 != top )
} }
if( count < gl->numvertexes ) // 如果count小於頂點數,說明存在環
else
}
•演算法時間複雜度:
–對乙個具有n個頂點,e條邊的網來說,初始建立入度為零的頂點棧,要檢查所有頂點一次,執行時間為o(n)。
–排序中,若aov網無迴路,則每個頂點入、出棧各一次,每個表結點被檢查一次,因而執行時間是 o(n+e)。
–所以,整個演算法的時間複雜度是 o(n+e)。
aoe網:在乙個表示工程的帶權有向圖無環中,用頂點表示事件,用有向邊表示活動,用邊上的權值表示活動的持續時間,這種有向圖的邊表示活動的網,我們稱之為aoe網(activity on edge network)。
假設以aoe-網表示乙個工程的施工流程圖,每條弧表示一項子工程,弧上的權值表示完成該項子工程所需要的時間。
需要研究的問題是:
1)完成整個工程至少需要多少時間?
2)哪些子工程是「關鍵工程」 ?即哪些子工程將影響整個工程的完成期限?
我們把aoe網中沒有入邊的頂點稱為始點或源點,沒有出邊的頂點稱為終點或匯點。
從源點到匯點的最長路徑稱為關鍵路徑,關鍵路徑的長度是完成整個工程的最短時間。
關鍵路徑上的活動稱為關鍵活動,關鍵活動是影響整個工程進度的關鍵。
資料結構 拓撲排序演算法
簡單地說,由某個集合上的乙個偏序得到該集合上的乙個全序,這個操作稱之為拓撲排序。偏序 只有部分可以比較關係 全序 全部都能比較關係 aov網 用頂點表示活動,用弧表示活動間的優先關係的有向圖稱為頂點表示活動的網。在aov網中,不應該出現有向環,因為存在環意味著某項活動應以自己為先決條件。對給定的ao...
資料結構與演算法11 拓撲排序
資料結構與演算法11 拓撲排序 拓撲排序是指在乙個aov網路 中找到一種節點的排序序列,使得序列中的任意乙個節點在它的所有前置節點的後面,滿足aov所表示的依賴關係,這樣的乙個序列就叫拓撲序列。而尋找這樣乙個序列的過程叫拓撲排序。拓撲排序往往不是唯一的,可能存在多種滿足同乙個aov網路的拓撲序列。一...
Python 資料結構與演算法 拓撲排序
幾乎在所有的專案,甚至日常生活,待完成的不同任務之間通常都會存在著某些依賴關係,這些依賴關係會為它們的執行順序行程表部分約束。對於這種依賴關係,很容易將其表示成乙個有向無環圖 directed acyclic graph,dag,無環是乙個重要條件 並將尋找其中依賴順序的過程稱為拓撲排序 topol...