16 12 09 拓撲排序 C

2021-07-25 06:41:46 字數 1506 閱讀 5579

拓撲

不存在迴路,就像流程圖一樣向下延伸。稱aov網圖。

拓撲排序就是按照箭頭順序往後排的,是為了解決乙個工程能否順利進行的。拓撲排序還有乙個重要的功能就是判斷節點是一條鏈,還是在某個節點出現了分叉。

排序的基本思路:

…………方法一

現在我們可以得到這個演算法的基本步驟:

1.構造空列表 l和s;

2.把所有沒有依賴節點(入度為0)的節點放入l;

3.當l還有節點的時候,執行下面步驟:

3.1 l中拿出乙個節點n(從l中remove掉),並放入s

3.2 對每乙個鄰近n的節點m,

3.2.1 去掉邊(n,m);(表示加入最終結果集s)

3.2.2 如果m沒有依賴節點(入度為零),把m放入l;

核心就是:每次都選取入度為0的節點,再更新其相鄰的節點的入度 。

這個是直觀也是常見的一種演算法。我們用乙個陣列degree[ ]記錄所有頂點的入度。刪除點時更新該陣列。

參考下面**函式:topologicalsort_1( )

…………方法二

另外一種方法是參考dfs,對圖的深度優先遍歷做些修改。我們確信在有向圖中如果存在一條邊(u,v),那麼頂點u會先於頂點v進入列表中。因此在深度遍歷時,用棧來儲存遍歷的順序。參考下面**的函式:topologicalsort_2( )

// c++實現的拓撲排序演算法

#include

#include

#include

using

namespace

std;

// 圖類

class graph

;graph::graph(int v)

void graph::addedge(int v, int w)

//類似深度優先遍歷,將和v相鄰的頂點(且為訪問過的)放入棧中

void graph::topologicalsortrecall(int v, bool visited, stack

&stk)

// 方法二,使用遞迴呼叫實現拓撲排序

void graph::topologicalsort2()

}// 方法一

void graph::topologicalsort1()

}list

zeronodes;//所有入度為0的點

list

result;//所有入度為0的點

for(int i=0; iif(degree[i] == 0)

}while(zeronodes.size() > 0)

}//列印結果

for(j= result.begin(); j != result.end(); j++)

cout

<< (*j) << " ";

}int main()

鳴謝

htp:

C 拓撲排序

拓撲排序是對aov網排序,aov網主要用於表示活動間的優先關係,aov網的特徵是不存在迴路,且是連通圖,但一定不是強連通圖。拓撲排序的演算法是非常簡單的,借助stl deque實現。把入度為0的頂點加入隊尾,頭出佇列,訪問這個頂點,並把這個頂點相連的頂點對應的邊刪除,若相連的點沒有入度,則把相連的點...

拓撲排序(c)

拓撲排序 實現 1.總體思路,遍歷並輸出所有出度為0的頂點,void sort list l,int ans for int i 0 i l dots i for int i 0 i l dots i int last 0 while isempty q w1 w1 next if last l d...

拓撲排序 C實現

接著上一次的c 實現,這次用c語言寫一遍。主要是多了棧stack的實現部分。參考了 資料結構 教材。如下 include include include include 圖的鄰接表儲存表示 define max vertex num 20 typedef struct arcnode arcnode...