一、定義
拓撲排序:對有向無環圖的頂點的一種排序,它使得如果存在一條從vi到vj的路徑,那麼在排序中vj出現在vi的後面。
示例:在學習課程圖中,存在有向邊二、aov網
引子:現有乙個工程亟待完成,我們需要製作施工的流程圖,它可以決定哪些子工程必須要先執行,哪些子工程要在某些工程執行後才可以執行。為了形象地反映出整個工程中各個子工程之間的先後關係,可用乙個有向圖來表示,圖中的頂點代表活動(子工程),圖中的有向邊代表活動的先後關係。
定義:我們把這種頂點表示活動、邊表示活動間先後關係的有向圖稱做頂點活動網,簡稱aov網。
乙個aov網應該是乙個有向無環圖,即不應該帶有迴路,因為若帶有迴路,則回路上的所有活動都無法進行(對於資料流來說就是死迴圈)。
在aov網中,若不存在迴路,則所有活動可排列成乙個線性序列,使得每個活動的所有前驅活動都排在該活動的前面,我們把此序列叫做拓撲序列,由aov網構造拓撲序列的過程叫做拓撲排序。
注:拓撲序列可能不是唯一的;aov網必須是無環的,因為只有有向無環圖才能形成拓撲序列。
三、演算法過程
在有向圖中選乙個沒有前驅的頂點並且輸出
從圖中刪除該頂點和所有以它為尾的弧(白話就是:刪除所有和它有關的邊)
重複上述兩步,直至所有頂點輸出,或者當前圖中不存在無前驅的頂點為止,後者代表我們的有向圖是有環的,因此,也可以通過拓撲排序來判斷乙個圖是否有環。
下圖是乙個aov網,要求對其進行拓撲排序。
(1)我們發現v6和v1是沒有前驅的,所以我們就隨機選去乙個輸出,我們先輸出v6,刪除和v6有關的邊,得到如下圖結果:
(2)我們繼續尋找沒有前驅的頂點,發現v1沒有前驅,所以輸出v1,刪除和v1有關的邊,得到下圖的結果:
(3)我們又發現v4和v3都是沒有前驅的,那麼我們就隨機選取乙個頂點輸出(具體看你實現的演算法和圖儲存結構),我們輸出v4,得到如下圖結果:
(4)我們輸出沒有前驅的頂點v3,得到如下結果:
(5)我們分別輸出v5和v2,此時全部頂點輸出完成
該圖的乙個拓撲序列為:v6 ---> v1 ---> v4 ---> v3 ---> v5 ---> v2
拓撲排序 1
time limit 1000msmemory limit 32768kb64bit io format i64d i64u 有一群人,打桌球比賽,兩兩捉對撕殺,每兩個人之間最多打一場比賽。球賽的規則如下 如果a打敗了b,b又打敗了c,而a與c之間沒有進行過比賽,那麼就認定,a一定能打敗c。如果a打...
拓撲排序(1)
include stdio.h include stdlib.h define max vextex num 20 定義頂點的最大值 define m 20 define stack init size 100 定義棧的大小 100 define stackincrement 10 定義棧的增量 1...
排課表 拓撲排序 自己寫的拓撲排序方法 1
現在你總共有 n 門課需要選,記為0到n 1。在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完成所有...