用C語言實現拓撲排序

2021-10-07 05:38:13 字數 2289 閱讀 1659

aov網:在乙個表示工程的有向圖中,頂點表示活動、邊表示活動間先後關係的有向圖稱做頂點活動網(activity on vertex network)。

在某些活動中,一些子活動必須要在某個特定的子活動完成後才能進行,像這樣的工程圖必須是無環的。如果有向圖的所有頂點都輸出,說明此圖沒有環,否則就有環

拓撲排序就是把圖中的結點按照活動的進行順序進行排列。例如:這是坐火車的流程圖:

它的拓撲序列應該是:12345678或者12346578或者12354678.

序列的順序與邊錶用頭插法還是尾插法建立有關,並且在輸入弧的時候,其弧的順序也會影響到拓撲序列,但是影響的只是不分先後順序的頂點,如:4,5,6。

既然要進行刪除操作,選擇鄰接表;

要判斷入度是否為0,頂點節點中還應該設定乙個in域來表示頂點的入度。

typedef

struct edgenode

edgenode ;

typedef

struct verexnode

adjlist[ maxvex ]

;

int

locate

( graphlist g ,

int t )

void

creategraph

( graphlist *g )

for( i =

0; i < g->vexnum ; i++

)printf

("請輸入圖中邊的條數:");

scanf

("%d"

,&g->edgenum )

;for

( i =

0; i < g->edgenum ; i++

)}

status topologicalsort

( graphlist g )

}printf

("end\n");

if( cnt < g.vexnum )

//比較輸出的頂點數與圖中頂點個數來判斷圖中是否有環

return error ;

else

return ok ;

}

源**:

#include

#include

#define maxvex 100

#define error 0

#define ok 1

typedef

int status ;

typedef

struct edgenode

edgenode ;

typedef

struct verexnode

adjlist[ maxvex ]

;typedef

struct

graphlist ;

void

creategraph

( graphlist *g )

;int

locate

( graphlist g ,

int t )

;status topologicalsort

( graphlist g )

;int

main

(void

)int

locate

( graphlist g ,

int t )

void

creategraph

( graphlist *g )

for( i =

0; i < g->vexnum ; i++

)printf

("請輸入圖中邊的條數:");

scanf

("%d"

,&g->edgenum )

;for

( i =

0; i < g->edgenum ; i++)}

status topologicalsort

( graphlist g )

}printf

("end\n");

if( cnt < g.vexnum )

return error ;

else

return ok ;

}

拓撲排序(C語言實現)

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

C 語言實現 拓撲排序

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

基礎拓撲排序 C語言實現

演算法步驟 1 根據鄰接矩陣統計每個頂點的入度,統計結果存在mark中 2 在mark中尋找為0的頂點i,找到後將mark i 並且更新與該點相關的頂點的mark陣列 3 重複步驟 2 直到所有點的mark均為 1。例項以及 全域性變數,圖的鄰接矩陣以及記錄陣列mark int a 6 6 int ...