資料結構 考研 拓撲排序

2021-10-24 12:04:20 字數 1820 閱讀 6870

獲得乙個圖的拓撲排序可以有深搜和廣搜兩種途徑。深搜是逆向思維,遍歷到遞迴最深處,層層返回的時候把結點壓棧,得到的是乙個逆序拓撲序列。廣搜是正向思維,從度為 0 的結點入手,每次將度為 0 的結點入隊,直到全部遍歷。

深搜:

int visited[5] = ;

//visited有三種狀態,未搜尋-0/搜尋中-1/搜尋完成-2

//如果乙個結點dfs到乙個visited為1的結點那就說明能夠通過這個結點再到達自己,說明有環

bool valid = true;//valid是標誌位,初始為true,一旦出現環,置為false

stacks;//棧儲存結果

void dfs(mgraph& g,int u)

else if(visited[i] == 1)

} }visited[u] = 2;

s.push(g.vertice[u]); //dfs**棧

} void findorder_dfs(mgraph& g); //visited

int indeg[5] = ; //入度表

int visit = 0; //已訪問的結點數

void bfs(mgraph& g,int u)

} } }

}void findorder_bfs(mgraph& g)mgraph;

//深度優先遍歷

/* 逆向思維:

對於乙個節點 u,如果它的所有相鄰節點都已經搜尋完成,那麼在搜尋回溯到u的時候,

u本身也會變成乙個已經搜尋完成的節點。我們對圖進行一遍深度優先搜尋,當每個節點

進行回溯的時候,把該節點放入棧中。最終從棧頂到棧底的序列就是一種拓撲排序。

*/ int visited[5] = ;

//visited有三種狀態,未搜尋-0/搜尋中-1/搜尋完成-2

//如果乙個結點dfs到乙個visited為1的結點那就說明能夠通過這個結點再到達自己,說明有環

bool valid = true;//valid是標誌位,初始為true,一旦出現環,置為false

stacks;//棧儲存結果

void dfs(mgraph& g,int u)

else if(visited[i] == 1)

} }visited[u] = 2;

s.push(g.vertice[u]); //dfs**棧

} void findorder_dfs(mgraph& g); //visited

int indeg[5] = ; //入度表

int visit = 0; //已訪問的結點數

void bfs(mgraph& g,int u)

} } }

}void findorder_bfs(mgraph& g){

//初始化入邊表

for(int i = 0;i < g.numvertices;i ++)

for(int j = 0;j < g.numvertices;j ++)

if(g.edge[i][j] > 0)

indeg[j] ++;

for(int i = 0;i < g.numvertices;i ++)

if(indeg[i] == 0 && !v[i]) bfs(g,i);

if(visit != g.numvertices) return; //有環返回

while(!res.empty()){

cout執行結果:

資料結構 拓撲排序

設g v,e 是乙個具有n個頂點的有向圖,v中的頂點序列v0,v1,v2,vn 1如果滿足下列條件 若從vi到vj有一條路徑,則在頂點序列中頂點vi必定在vj之前,這樣的序列稱為拓撲序列。對乙個有向圖構造拓撲序列的過程稱為拓撲排序 topological sort 顯然,每乙個可以構造出不止乙個拓撲...

資料結構 拓撲排序

aov網路用有向圖的頂點表示活動,頂點之間的有向邊表示活動間的先後關係,這種有向圖稱為頂點表示活動網路,簡稱aov網路。當限制各個活動只能序列進行時,可以將aov網路中所有頂點排列成乙個線性序列,且vi必須在vj之前,我們就稱這個線性序列為拓撲序列,把對aov網構造拓撲序列的操作稱為拓撲排序。拓撲排...

資料結構 拓撲排序

拓撲排序是圖中重要的操作之一,在實際中應用很廣泛.再aov網中,不應該出現有向環路,因為有環意味著某項活動以自己作為先決條件,這樣就進入了死迴圈.因此,對給定的aov網應該首先判定網中是否存在環 檢測的辦法就是對有向圖進行拓撲排序,拓撲排序是指照有向圖給出的次序關係,將圖中頂點排成乙個線性序列,對於...