演算法 拓撲排序

2021-10-07 20:15:23 字數 2317 閱讀 1141

​ 圖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,c6

poj1094.

poj2367.

拓撲排序演算法

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

拓撲排序演算法

對乙個 有向無環圖 directed acyclic graph簡稱dag g進行拓撲排序,是將g中所有頂點排成乙個線性序列,使得圖中任意一對頂點u和v,乙個有向無環圖的拓撲序列不是唯一的 進行拓撲排序的演算法並不複雜 1 在有向圖中選乙個沒有前驅 入度為0 的頂點且輸出之 2 從圖中刪除該頂點及它...

演算法 拓撲排序

定義 應用 有向圖來表示,圖中的頂點代表活動 子工程 圖中的有向邊代表活動的先後關係,即有向邊的起點的活動是終點活動的前序活動,只有當起點活動完成之後,其終點活動才能進行。通常,我們把這種頂點表示活動 邊表示活動間先後關係的有向圖稱做頂點活動網 activity on vertex network ...