圖g=(v,e)是乙個具有n個頂點的有向圖,v中的頂點序列v1,v2,v3…vn為乙個拓撲序列當且僅當該頂點序列滿足下列條件:若是圖中的邊(即頂點vi到頂點vj有一條路徑),則在序列中頂點vi必須排在頂點vj之前。
在乙個有向圖中找乙個拓撲序列的過程稱為拓撲排序。
課程代號
課程名稱
先修課程
c1高等數學無c2
程式設計無c3
離散數學
c1c4
資料結構
c1,c2
c5編譯原理
c2,c4
c6作業系統
c4,c7
c7計算機組成原理
c2課程間的關係如下圖所示:
上圖中可以得到的拓撲排序:c1->c3->c2->c4->c7->c6->c5,也可說是c2->c7->c1->c3->c4->c5->c6。除此之外還可以得到其他的拓撲排序,可以按照任何乙個學習順序來學習。
步驟如下:
從有向圖中選擇乙個入度為0的頂點並且輸出它。
從圖中刪去改頂點。並且刪去從該頂點出發的全部有向邊。
重複前兩步,直到圖中不存在沒有入度為0的頂點位置。
這樣操作之後的結果有兩種:
對於上述例子中的過程如下:
第一步,首先入度為0的頂點有c1和c2,選擇輸出c1.
第二步,此時入度為0的頂點有c2和c3,選擇輸出c3.
第三步,此時入度為0的頂點只有c2,輸出c2.
第四步,此時入度為0的頂點有c4和c7,選擇輸出c4.
第五步,此時入度為0的頂點有c5和c7,選擇輸出c7.
第六步,此時入度為0的頂點有c5和c6,選擇輸出c6.
第七步,此時入度為0的頂點有c5,輸出c5.
最終得到的序列為:c1->c3->c2->c4->c7->c6->c5
public
class
demo,,
,,,,
};string[
] nodes =
; demo demo =
newdemo()
; string str = demo.
topologicalsort
(graph, nodes)
; system.out.
println
(str);}
public string topologicalsort
(int
graph, string[
] nodes)
int num =0;
for(
int j =
0; j < graph.length; j++)}
nums[i]
= num;
}for
(int i =
0; i < nums.length; i++
) flag =
true
;break;}
}}result = result.
substring(0
, result.
length()
-1);
for(
int i =
0; i < nums.length; i++)}
return result;
}}
輸出的結果如下:c1,c2,c3,c7,c4,c5,c6poj1094.
poj2367.
拓撲排序演算法
對許多資料結構教材實在不滿意,至少我是看不懂 至於拓撲排序演算法,教材上那些偽 真真教人頭暈。只寫了幾個struct結構,我根本看不出這是鄰接表。如果給出乙個清晰明了的圖,一切不就簡單了?總之,關鍵就是建立乙個鄰接表。然後利用這個表進行拓撲排序。邊表結點宣告 typedef struct edgen...
拓撲排序演算法
對乙個 有向無環圖 directed acyclic graph簡稱dag g進行拓撲排序,是將g中所有頂點排成乙個線性序列,使得圖中任意一對頂點u和v,乙個有向無環圖的拓撲序列不是唯一的 進行拓撲排序的演算法並不複雜 1 在有向圖中選乙個沒有前驅 入度為0 的頂點且輸出之 2 從圖中刪除該頂點及它...
演算法 拓撲排序
定義 應用 有向圖來表示,圖中的頂點代表活動 子工程 圖中的有向邊代表活動的先後關係,即有向邊的起點的活動是終點活動的前序活動,只有當起點活動完成之後,其終點活動才能進行。通常,我們把這種頂點表示活動 邊表示活動間先後關係的有向圖稱做頂點活動網 activity on vertex network ...