15. 圖--拓撲排序

拓撲排序

定義

  • 拓撲序:如果在圖中從VW 有一條有向路徑,則V 一定排在W 之前。滿足此條件的頂點序列稱爲一個拓撲序。
  • 拓撲排序:獲得一個拓撲序的過程。
  • AOV(Activity On Vertex)網絡如果有合理的拓撲序,則必定是有向無環圖(Directed Acyclic Graph,DAG)

基本算法

每次輸出入度爲0的頂點,輸出以後將該頂點的鄰接點的入度減一

實現

  1. 採用隊列存儲入度爲0的頂點
  2. 每次從隊列中取出一個入度爲0的頂點,
  3. 遍歷該頂點的鄰接點,併入度減一。
  4. 如果減一以後,鄰接點的入度爲0,則將鄰接點入隊列
  5. 重複2-5這個過程,直至隊列中沒有頂點
  6. 最後需要判斷輸出的頂點是否爲圖中所有的頂點,如果不是,則說明圖中有迴路
void TopSort() {
    for ( 圖中的每個頂點 V ) {
        if (Indegree[V] == 0)   // 入度爲0
            Enqueue(V, Q);
    }

    while (!IsEmpty(Q)) {
        V = Dequeue(Q);
        輸出V,或者記錄V的輸出序號;
        cnt++;  // 頂點輸出的計數器

        for ( V 的每個鄰接點 W ) {
            if (--Indegree[W] == 0)
                Enqueue(W, Q);
        }
    }

    if (cnt != 圖中的頂點數)
        Error("圖中有迴路");
}
  • 如果圖有N 個頂點,E 條邊,則時間複雜度:T=O(N+E)
  • 這個算法可以用來檢測有向圖是否是DAG
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章