6 2 拓撲排序

2022-03-20 17:13:06 字數 2107 閱讀 3765

在許多應用中,有向無迴路圖可用於抽象具有發生先後順序的事件,圖的搜尋演算法可以用於解決具有先決條件的問題。假設我們要安排一系列任務,但是只有在某個任務的先決條件具備時才能著手完成這個任務。我們希望以某種先後順序組織這些任務,以便每項任務都是在先決條件已完成的前提下逐個完成。

因為任務之間存在先決條件限制,也就是頂點之間存在方向性,所以這一類問題可以用有向無環圖(dag)來描述。

如圖給出

乙個學科學習的例子,其中必須先學完某些功課才能學習其它功課,當然也有一些比較獨立的功課,例如體育課。圖中有向邊(u, v)表示功課u必須在功課v之前學習。所以該圖的拓撲排序將可以給出乙個功課學習的先後順序。

圖 功課學習

先後順序圖

事實上拓撲排序是有向無環圖深度優先搜尋的直接應用。假設對某一有向無迴路圖g=(v, e)執行dfs,並確定其所有頂點的搜尋完成時間f。圖中某一條邊(u, v) 在dfs過程中,f[u]必定大於f[v]。所以只要將圖中各頂點按照dfs搜尋所獲得的搜尋完成時間由大到小進行排序即可完成拓撲排序。

根據上面的分析,拓撲排序演算法實現如下:

/*** 圖的拓撲排序演算法,排序後各頂點的標號按順序排放至

* 陣列,並將該陣列返回。

* @param

g    帶排序的有向無環圖

* @return

排序後頂點存放至陣列

*/public

static

int topologocal_sort(graphlnk g)

//建立陣列,用於放置排序後各頂點的標號

int r = new

int[n];

//按照f值由大到小將各頂點排序

//遍歷n次

for(int i = 0; i 

//將找到的最大值重賦值為無窮小

f[_max_idx] = -integer.max_value;

//將序號存放置陣列r

r[i] = _max_idx;

}return r;

}演算法首先對圖進行dfs搜尋,並獲得各頂點完成遍歷的時間f。然後,將各頂點的序號逐個取出並放置到待返回的陣列中。頂點取出的順序根據頂點的f時間值由大到小決定。

圖各頂點標號

如圖,頂點經過dfs後各頂點的搜尋完成時間d[u]/f[u]為:

圖 功課學習

先後順序

對應的有向無環圖

呼叫拓撲排序函式對該圖進行拓撲排序:

//圖頂點標號對應陣列中的功課名稱

string course = ;

//從檔案獲取圖的資訊

graphlnk gl = 

utilities.bulidgraphlnkfromfile("graph\\graph5.txt");

//對圖進行拓撲排序

int od = topologicalsort.topologocal_sort(gl);

//列印拓撲排序後頂點順序

for(int i = 0; i 

排序後各頂點的順序為:

2. 體育  1. 算術  0. 語文  4. 數學  5. 基礎物理  7. 固態物理  3. 英語  6. 基礎物理英文  8. 固態物理英文  

按照這個順序可以將圖中每個頂點沿水平方向形成乙個頂點序列,使得圖中有向邊都由左指向右。

圖圖中功課學習拓撲排序結果圖

拓撲排序有乙個很重要的應用:在c/c++語言中,我們的工程中常常會包含很多標頭檔案,標頭檔案有會include別的標頭檔案,所以這些標頭檔案之間形成乙個有向圖。編譯器在編譯時需要確定檔案的編譯先後次序。aha,拓撲排序可以用來為標頭檔案進行排序!

python 拓撲排序 Python 拓撲排序

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

python 排序 拓撲排序

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

拓撲排序演算法

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