拓撲排序 C語言

2021-08-28 08:41:36 字數 1032 閱讀 2011

拓撲排序就是由某個集合上的乙個偏序得到該集合上的乙個全序。

某個集合的偏序就是指集合中僅有部分成員之間可比較,而全序是集合中全部成員都可以進行比較。可以進行拓撲排序的需要是乙個有向無環圖。

對乙個圖進行拓撲排序,就要進行以下幾個步驟:

(1)在有向圖中選乙個沒有前驅的頂點並輸入之;

(2)從圖中刪除該頂點和所有以它為尾的弧;

重複這兩個步驟,直到所有頂點均以輸出(拓撲排序成功),或者當前圖中不存在無前驅的頂點為止(說明圖中存在環,無法進行排序)                                      (出自嚴蔚敏版資料結構)

用**實現以上操作時,採用棧來實現頂點的輸出。迴圈查詢入度為0的頂點入棧,最後對入棧頂點進行統計,若小於頂點數,則說明圖存在有向環;若等於頂點數,則說明拓撲排序成功。

**實現:

/**拓撲排序**/

void topo(arraygraph *g,int n)

;///入度矩陣

int sortor[n]=;///用於存放排序的序列

int sortc=0;

int stact[n];

int cure=n+1;

inits(stact,cure);

int coun=0;///用來統計入度為0的頂點數

for(int i=0;iarcs[i][j];

if(!(indegree[i]))

push(stact,cure,i);///入度為0的頂點入棧

}while(!isempty(stact,cure))

}if(coun==n)

{printf("\n拓撲排序為:");

for(int i=0;i執行結果:

時間複雜度:o(n+e)

第乙個迴圈入棧的時間複雜度為o(n),在拓撲排序過程中,若圖為無環圖,那麼每個頂點進棧,出棧,入度-1的操作在while中總共執行e次,所以總時間複雜度為o(n+e)。

拓撲排序(C語言實現)

拓撲排序可以將乙個有向無環圖轉換為乙個線性序列。它也是判定乙個有向圖是否是無環的方法之一。如何進行拓撲排序,方法如下 1 從有向圖中選取乙個 沒有前驅 入度為 0 的 頂點,並輸出之 2 從有向圖中刪去此頂點以及所有以它為尾的 弧 弧頭頂點的入度減 1 重複上述兩步,直至圖空,或者圖不空但找不到 無...

拓撲排序 C語言 鄰接表

資料結構 typedef struct side 邊 side,slink typedef struct vertex 頂點 vertex,adjlist 20 typedef struct graph 圖 graph,glink 建立 void creategraph glink g printf...

C 語言實現 拓撲排序

1 拓撲排序的概念 對乙個1.在有向圖中選乙個沒有前驅的頂點並且輸出 2.從圖中刪除該頂點和所有以它為尾的弧 白話就是 刪除所有和它有關的邊 3.重複上述兩步,直至所有頂點輸出,或者當前圖中不存在無前驅的頂點為止,後者代表我們的有向圖是有環的,因此,也可以通過拓撲排序來判斷乙個圖是否有環。3 拓撲排...