1. 程式人生 > 其它 >v9_拓撲排序-Python實現

v9_拓撲排序-Python實現

技術標籤:筆記python演算法有向圖

拓撲排序(Topological Sorting)

目錄:

AOV網(Activity On Vertex Network)

定義

在現代化管理中,人們常用有向圖來描述和分析一項工程的計劃和實施過程,一個工程常被分為多個小的子工程,這些子工程被稱為活動(Activity),在有向圖中若以頂點表示活動,有向邊表示活動之間的先後關係,這樣的圖簡稱為AOV網。一個AOV網必定是一個有向無環圖,也就是不應該帶有迴路,否則就會出現先後關係的自相矛盾。

條件

  • 每個頂點出現且只出現一次
  • 若A在序列中排在B的前面,則在圖中不存在從B到A的路徑

特性

  • 拓撲排序並不唯一
  • 有向無環圖一定存在拓撲排序

舉個栗子

在這裡插入圖片描述
如圖所示,比如這是一項大工程,大工程的最終目的是實現f,將該項工程劃分成一個個的小工程,依次實現。而要完成b的基礎上必須要先完成a,完成c的基礎上要完成a,完成d的基礎上要完成b和c,以此類推…

拓撲排序(Topological Sorting)

構造拓撲序列的拓撲排序演算法思想

  1. 選擇一個入度為0的頂點;
  2. 從AOV網中刪除此頂點及以此頂點為起點的關聯邊;
  3. 重複上述兩步直到不存在入度為0的頂點為止;
  4. 若AOV網中還有頂點,則說明有向圖存在迴路。

程式碼實現

def
topoSort(graph): in_degrees = dict((u, 0) for u in graph) # 初始化所有頂點入度為0 num = len(in_degrees) for u in graph: for v in graph[u]: in_degrees[v] += 1 # 計算每個頂點的入度 Q = [u for u in in_degrees if in_degrees[u] == 0] # 篩選入度為0的頂點 seq = [] while Q: u = Q.pop(
) # 預設從最後一個刪除 seq.append(u) for v in graph[u]: in_degrees[v] -= 1 # 移除其所有出邊 if in_degrees[v] == 0: Q.append(v) # 再次篩選入度為0的頂點 if len(seq) == num: # 輸出的頂點數是否與圖中的頂點數相等 return seq else: return None G = { 'a': 'bf', 'b': 'cdf', 'c': 'd', 'd': 'ef', 'e': 'f', 'f': '' } print(topoSort(G)) # 輸出結果如下 ['a', 'b', 'c', 'd', 'e', 'f']