資料結構與演算法(C語言) 拓撲排序 關鍵路徑

2021-08-25 05:47:00 字數 2117 閱讀 7980

乙個無環的有向圖稱為無環圖(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...