拓撲排序(Topological Sorting)的任務是給有向無環圖(DAG, Directed Acyclic Graph)上的所有節點(vertex)排序,其要求是:
如果有從u到v的邊(edge),或存在由u到v的路徑(path),那麼u不能出現在v後
CSCI2110 中使用的算法是 Kahn’s Algorithm,基本思路爲維護一個入度(indegree)爲 0 的節點的隊列,然後依次“刪除”從入度爲 0 點出發的邊,基本思路如下:
- 首先計算 DAG 中所有點的入度,並將入度爲 0 的點放入一個隊列中
- 從隊列中取出(dequeue)一個點加入結果,依次刪除從該節點出發的邊
- 如果刪除後其後繼節點入度爲 0,將其入隊(enqueue)
- 重複 2~3 步直到隊列爲空
核心代碼:
|
|
演示:
|
|
輸出:
|
|
一點需要解釋的實現細節:
- 我使用鄰接表(Adjacency List) 存儲圖
- 我使用了Static Factory來封裝類的實例化過程
具體實現見完整源代碼:Github Repo