拓撲排序 java

2021-07-31 17:38:16 字數 1477 閱讀 2116

拓撲排序(topological order)是指,將乙個有向無環圖(directed acyclic graph簡稱dag)進行排序進而得到乙個有序的線性序列。

這樣說,可能理解起來比較抽象。下面通過簡單的例子進行說明! 

例如,乙個專案包括a、b、c、d四個子部分來完成,並且a依賴於b和d,c依賴於d。現在要制定乙個計畫,寫出a、b、c、d的執行順序。這時,就可以利用到拓撲排序,它就是用來確定事物發生的順序的。

在拓撲排序中,如果存在一條從頂點a到頂點b的路徑,那麼在排序結果中b出現在a的後面。

拓撲排序演算法的基本步驟:

1.構造乙個佇列q(queue) 和 拓撲排序的結果佇列t(topological); 

2.把所有沒有依賴頂點的節點放入q; 

3.當q還有頂點的時候,執行下面步驟: 

3.1從q中取出乙個頂點n(將n從q中刪掉),並放入t(將n加入到結果集中); 

3.2對n每乙個鄰接點m(n是起點,m是終點); 

3.2.1去掉邊; 

3.2.2如果m沒有依賴頂點,則把m放入q; 

注:頂點a沒有依賴頂點,是指不存在以a為終點的邊。

以上圖為例,來對拓撲排序進行演示。

第1步:將b和c加入到排序結果中。 

頂點b和頂點c都是沒有依賴頂點,因此將c和c加入到結果集t中。假設abcdefg按順序儲存,因此先訪問b,再訪問c。訪問b之後,去掉邊和,並將a和d加入到佇列q中。同樣的,去掉邊和,並將f和g加入到q中。 

(01) 將b加入到排序結果中,然後去掉邊和;此時,由於a和d沒有依賴頂點,因此並將a和d加入到佇列q中。 

(02) 將c加入到排序結果中,然後去掉邊和;此時,由於f有依賴頂點d,g有依賴頂點a,因此不對f和g進行處理。 

第2步:將a,d依次加入到排序結果中。 

第1步訪問之後,a,d都是沒有依賴頂點的,根據儲存順序,先訪問a,然後訪問d。訪問之後,刪除頂點a和頂點d的出邊。 

第3步:將e,f,g依次加入到排序結果中。

因此訪問順序是:b -> c -> a -> d -> e -> f -> g

public static void 拓撲排序(node graph){

listtopopath = new arraylist();

stackstack = new stack();

for(int i=0;i

python 拓撲排序 Python 拓撲排序

python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...

python 排序 拓撲排序

在電腦科學領域中,有向圖的拓撲排序是其頂點的先行排序,對於每個從頂點u到頂點v的有向邊uv,在排序的結果中u都在v之前。如果圖是有向無環圖,則拓撲排序是可能的 為什麼不說一定呢?圖論 是組合數學的乙個分支,它和其他分支比如 群論 拓撲學 矩陣論有著密切的關係。圖是圖論的主要研究物件。圖是由若干給定的...

拓撲排序演算法

對許多資料結構教材實在不滿意,至少我是看不懂 至於拓撲排序演算法,教材上那些偽 真真教人頭暈。只寫了幾個struct結構,我根本看不出這是鄰接表。如果給出乙個清晰明了的圖,一切不就簡單了?總之,關鍵就是建立乙個鄰接表。然後利用這個表進行拓撲排序。邊表結點宣告 typedef struct edgen...