獲得乙個圖的拓撲排序可以有深搜和廣搜兩種途徑。深搜是逆向思維,遍歷到遞迴最深處,層層返回的時候把結點壓棧,得到的是乙個逆序拓撲序列。廣搜是正向思維,從度為 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網應該首先判定網中是否存在環 檢測的辦法就是對有向圖進行拓撲排序,拓撲排序是指照有向圖給出的次序關係,將圖中頂點排成乙個線性序列,對於...