C 語言實現 拓撲排序

2022-09-01 16:03:14 字數 1623 閱讀 4481

1、拓撲排序的概念

對乙個1. 在有向圖中選乙個沒有前驅的頂點並且輸出

2. 從圖中刪除該頂點和所有以它為尾的弧(白話就是:刪除所有和它有關的邊)

3. 重複上述兩步,直至所有頂點輸出,或者當前圖中不存在無前驅的頂點為止,後者代表我們的有向圖是有環的,因此,也可以通過拓撲排序來判斷乙個圖是否有環。

3、拓撲排序過程圖示

3.1 如果我們有如下的乙個有向無環圖,我們需要對這個圖的頂點進行拓撲排序,過程如下:

3.2 首先,我們發現v6和v1是沒有前驅的,所以我們就隨機選去乙個輸出,我們先輸出v6,刪除和v6有關的邊,得到如下圖結果:

3.3 然後,我們繼續尋找沒有前驅的頂點,發現v1沒有前驅,所以輸出v1,刪除和v1有關的邊,得到下圖的結果:

3.4 然後,我們又發現v4和v3都是沒有前驅的,那麼我們就隨機選取乙個頂點輸出(具體看你實現的演算法和圖儲存結構),我們輸出v4,得到如下圖結果:

3.5 然後,我們輸出沒有前驅的頂點v3,得到如下結果: 

3.6 然後,我們分別輸出v5和v2,最後全部頂點輸出完成,該圖的乙個拓撲序列為:v6–>v1—->v4—>v3—>v5—>v2

4.拓撲排序的**實現

#include#include

#include

#include

#include

using

namespace

std;

const

int max_v=100

;int

main()

intx,y;

vector

g[max_v];

intin[max_v];//

用於存放頂點的入度數

memset(in,0,sizeof(in

));

for(int i=0;i)

queue

que;

for(int i=0;i)

int flag=1

;

while(!que.empty())

}return0;

}

輸入:

輸出:

練習:hdu 1285

hdu 3342

hdu 2647

拓撲排序(C語言實現)

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

基礎拓撲排序 C語言實現

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

用C語言實現拓撲排序

aov網 在乙個表示工程的有向圖中,頂點表示活動 邊表示活動間先後關係的有向圖稱做頂點活動網 activity on vertex network 在某些活動中,一些子活動必須要在某個特定的子活動完成後才能進行,像這樣的工程圖必須是無環的。如果有向圖的所有頂點都輸出,說明此圖沒有環,否則就有環 拓撲...