在許多應用中,有向無迴路圖可用於抽象具有發生先後順序的事件,圖的搜尋演算法可以用於解決具有先決條件的問題。假設我們要安排一系列任務,但是只有在某個任務的先決條件具備時才能著手完成這個任務。我們希望以某種先後順序組織這些任務,以便每項任務都是在先決條件已完成的前提下逐個完成。
因為任務之間存在先決條件限制,也就是頂點之間存在方向性,所以這一類問題可以用有向無環圖(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...