1. 程式人生 > >C#實現有向無環圖(DAG)拓撲排序

C#實現有向無環圖(DAG)拓撲排序

對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u線上性序列中出現在v之前。通常,這樣的線性序列稱為滿足拓撲次序(Topological Order)的序列,簡稱拓撲序列。簡單的說,由某個集合上的一個偏序得到該集合上的一個全序,這個操作稱之為拓撲排序.

線性結構概念

總的來說,“線性結構”是一個有序資料元素的集合 線性結構滿足以下特點:

  1. 集合中必存在唯一“第一個元素”;
  2. 集合中必存在唯一“最後一個元素”;
  3. 除了最後一個元素,所有元素均有唯一“後繼結點”;
  4. 除了第一個元素,所有元素均有唯一“前趨結點”

和我們abp Module很像,第一個載入模組永遠是其ABP核心模組,最後一個模組永遠是我們的啟動模組

舉例

1.大學課程排序
大學課程的學習是有先後順序的,C語言是基礎,資料結構依賴於C語言,其它課程也有類似依賴關係。這樣的一個課程安排是怎麼實現的呢?

2.VS專案編譯順序
假設VS中有三個專案A,B,C,它們的關係如下。VS編譯器是如何判斷三個專案的編譯順序的呢?
A->B->C A引用B B引用C
A->B->C->A 提示迴圈引用

ABP的Module

ABP中的模組也是如此,不可迴圈引用相互依賴A->B B->A

X

C#實現深度優先搜尋