拓撲排序
定義
- 拓撲序:如果在圖中從
V 到W 有一條有向路徑,則V 一定排在W 之前。滿足此條件的頂點序列稱爲一個拓撲序。 - 拓撲排序:獲得一個拓撲序的過程。
- AOV(Activity On Vertex)網絡如果有合理的拓撲序,則必定是有向無環圖(Directed Acyclic Graph,DAG)
基本算法
每次輸出入度爲0的頂點,輸出以後將該頂點的鄰接點的入度減一
實現
- 採用隊列存儲入度爲0的頂點
- 每次從隊列中取出一個入度爲0的頂點,
- 遍歷該頂點的鄰接點,併入度減一。
- 如果減一以後,鄰接點的入度爲0,則將鄰接點入隊列
- 重複2-5這個過程,直至隊列中沒有頂點
- 最後需要判斷輸出的頂點是否爲圖中所有的頂點,如果不是,則說明圖中有迴路
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