知識點 8 4 拓撲排序與關鍵路徑

2022-04-30 19:27:11 字數 4681 閱讀 3473

總目錄 > 8 圖論 > 8.4 拓撲排序與關鍵路徑

前言

想起當年參加 ctsc 時 dp 王 zed 用拓撲序 dp 過了一道題直接一飛沖天,而一旁的蒟蒻拿了個 10 分 gg。

子目錄列表

1、dag 與 aov 網

2、拓撲排序

3、aoe 網與關鍵路徑

8.4 拓撲排序與關鍵路徑

1、dag 與 aov 網

乙個無環的有向圖被稱作有向無環圖(dag,directed acycline graph)。它不同於有向樹,dag 將有向邊改成無向邊後可以出現環,而有向樹不行。

dag 應用廣泛,除了在動態規劃中提到了 4.4  樹形 / dag / 數字 dp ,它往往是描述一項工程或系統進行過程的有效工具。所有的大型工程(project)都可以被劃分為若干個子工程,這些子工程被稱作活動(activity)。在整個工程中,有些活動必須在其他相關活動完成後才能開始,也就是說,乙個活動的開始是以其所有前序活動的完工為先決條件。部分活動沒有先決條件,則可以隨時開始。人們關心這個工程是否能夠順利進行,如果能,如何安排工程完成的先後順序使得所花費時間最短,而 dag 正是形象反映出整個工程的活動之間的約束關係的最佳選擇。

頂點表示活動有向邊表示活動之間的約束關係,這樣的 dag 被稱作頂點活動網(aov 網,activity on vertex network)

2、拓撲排序

① 定義

根據上述對 aov 網的定義,我們先來舉個例子。

傑克對計算機很感興趣,進入大學後他如願以償地進修計科專業。學校發給他乙份培養方案,上面寫滿了各種課程:

課程代號  課程名稱            先修課程

c1            高等數學            無

c2            c 程式設計        無

c3            離散數學            c1, c2

c4            資料結構            c3, c5

c5            c++ 程式設計    c2

c6            編譯技術            c4, c5

c7            作業系統            c4, c9

c8            大學物理            c1

c9            計算機組成        c8

傑克表示頭都暈了,他想理清楚這些課程的關係。這時候,使用一張 aov 網來展示:

一下子就變得清晰起來 —— 他需要先上 c1 高等數學 和 c2 c語言設計 兩門課程,而後 c3 離散數學,c5 c++程式設計,c8 大學物理 就可以上了;以此類推,最後上 c7 作業系統,c6 編譯技術。

aov 網為什麼是 dag 圖?如果出現了環,對於課程的選擇則必然出現問題:假設 c1 是 c8 的前序課程,而 c8 又是 c1 的前序課程,那麼兩門課上課的先後順序則無法確定,導致整個課程學習無法完成。這種情況如果出現在工程中,則稱為死鎖死迴圈,是必須要避免的。

根據 aov 網求得的這樣的序列,我們稱之為拓撲序(topological order)。構造拓撲序的這個過程,稱之為拓撲排序(topological sort)

② 性質

注意到,比如剛開學時,傑克可以選擇先上 c1 再上 c2,反之同樣可以;學完了 c1 和 c2,傑克可以先上 c3 也可以先上 c8……也就是說,拓撲序列並不具有唯一性

通過歸納證明,容易得到如下推理:

圖能進行拓撲排序的充分必要條件是該圖為 dag。兩者為等價關係。判定乙個圖是否為 dag,檢驗它能否進行拓撲排序即可。

③ kahn 演算法

kahn 演算法用於實現拓撲排序。預處理出所有結點的入度,將入度為 0 的結點加入集合 s,每次從 s 中取出任意乙個頂點 u 並儲存到陣列 ans,遍歷以 u 為起點的所有邊,並將對應終點的入度減 1,如果減到了 0,則加入集合 s,不斷重複,直到所有頂點輸出完畢。ans 陣列最終的結果即拓撲序。

kahn 演算法使用佇列實現。

④ 例題與**

aov 網在生活中還是很常見的,課程之間的關係,元件之間的依賴關係,工程的先後順序等等。下面還給出一道例題:

【例題】【士兵排隊】

有 n 名士兵(1 <= n <= 100),編號依次為 1, 2, 3, ..., n。進行佇列訓練時,指揮官要把一些士兵從高到矮依次排成一行,但現在指揮官不能直接獲得每個士兵的身高資訊,只能獲得「p1 比 p2 高」這樣的比較結果(p1, p2 ∈ ,記為 p1 > p2),如「a > b」表示 a 比 b 高。編一程式,根據所得到的比較結果求出符合條件的排隊方案。注:比較結果中沒有涉及到的士兵不參加排隊。

例如,設有3個士兵 1, 2, 3,給出關係 (1, 2), (2, 3)。其中 (1, 2) 表示士兵 1 高於 2,當上面的關係給出之後,可以將他們排成一隊:123。

輸入:第一行兩個正整數 n, m,接下來 m 行中每行兩個整數 x, y,表示士兵 x 比士兵 y 高。

輸出:從高到矮依次輸出每乙個士兵的編號,如果沒有答案輸出 -1。

根據身高關係直接構建 aov 網,使用 kahn 演算法求出拓撲序,即最終答案。

**:

1 #include 2

using

namespace

std;34

#define maxn 105

5#define maxm 20567

intn, m, u, v, a[maxn], tot, h[maxn], q[maxn];89

class

edge e[maxm];

1314

void add(int u, int

v) , h[u] =tot;

16 a[v]++;17}

1819

void

kahn() 29}

3031

intmain()

3、aoe 網與關鍵路徑① aoe 網與 aov 網相對應的是aoe 網(activity on edge network),即邊表示活動的網。aoe 網是賦權 dag 圖,頂點表示事件(event),弧表示活動,權表示活動持續的時間。通常,aoe 網是用來估算工程的完成時間

與 aov 網不同的是,aoe 網必然只有乙個入度為 0 的點(起點)乙個出度為 0 的點(終點)。從起點出發,各個活動可以並行進行,所以完成工程的最短時間是從起點到終點的最長路徑的長度。這條最長的路徑稱之為關鍵路徑

② 關鍵路徑

假設開始點為 u,從 u 到結點 vi 的最長路徑長度叫做事件 vi 的最早發生時間。這個時間決定了所有以事件 vi 為標誌而可以開始進行的活動的最早發生時間。對於活動 ai,其最早發生時間用ei表示。在不推遲整個工程完成進度的前提,即不出現沒有活動正在進行的情況,活動 ai 的最遲發生時間li表示。li 和 ei 的差值為活動 ai 的時間餘量。時間餘量為 0 的活動被稱作關鍵活動關鍵路徑上的所有活動均為關鍵活動。

也就是說,非關鍵活動的進度的提前與延後(在 [ei, li] 內),其實對整個工程的進度是沒有影響的。所以,分析這種工程的關鍵在於找到關鍵活動,即找到 ei = li 的 ai,以提高工效,縮短工期。

③ 實現

在 kahn 演算法求出拓撲序的基礎上,增加乙個拓撲序結點棧,按照拓撲序搜尋各個活動,及計算相應事件的最早 / 最遲開始時間。具體過程暫略。

拓撲排序與關鍵路徑

什麼是拓撲排序 設g v,e 是乙個具有n個頂點的有向圖,v中頂點序列v1,v2,vn,稱為乙個拓撲序列,當且僅當該頂點序列滿足下列條件 若是圖中的邊 或從頂點i到j有一條路徑 則在拓撲序列中頂點i必須排在頂點j之前。在乙個有向圖中找 乙個拓撲序列的過程稱為拓撲排序。拓撲排序步驟 1 從有向圖中選擇...

拓撲排序與關鍵路徑

拓撲排序 只適用於aov網 有向無環圖 運用 事務先後 非唯一 拓撲排序思路 選擇乙個入度為 0 的點 並輸出 從aov網中刪除此頂點以及此頂點為起點的所有關聯邊 重複上述兩步,直到不存在入度為0的頂點為止 如果書粗糙頂點數小於aov網中的頂點數,則輸出 有迴路資訊 否則輸出的頂點序列就是一種拓撲排...

拓撲排序,關鍵路徑

拓撲排序 對於乙個流程圖,可以用頂點表示活動,弧表示活動間的優先關係,這樣所表示的有向圖稱為頂點表示活動的網,即aov網。在網中,如果頂點i到頂點j有一條有向路徑,或者 i,j 是一條弧,則i是j的前驅,j是i的後繼。aov網中不應該出現環。拓撲排序的思想很簡單,1 在有向圖中選乙個沒有前驅的頂點輸...