aov網是有向圖的一類應用,在aov網中,用頂點表示某個有一定規模的「工程」裡的不同活動,用圖中的邊表示各項活動之間的先後順序關係。一種常見的aov網例項是大學課程的先修關係,以下**列出了計算機專業若干課程及其先修課程:
課程編號
課程名稱
先修課程
c1高等數學
c2程式設計基礎
c3資料結構
c1,c2
c4離散數學
c1c5
普通物理
c1c6
編譯原理
c2,c3,c4
c7計算機原理
c3,c4,c5
c8作業系統
c3,c4,c6
c9資料庫原理
c3,c7,c8
c10計算機網路
c4,c7,c8
對應的aov網路為:
可以把aov網路裡的有向邊看作一種「順序」關係。拓撲排序問題就是問,在乙個aov網裡的活動能否排成一種全序。
設g是乙個具有n個頂點的有向無環圖,圖中的頂點序列v1、v2、...、vn,稱為乙個拓撲序列,當且僅當該頂點序列滿足下面的條件,若vi, vj之間有邊直接相連,則在序列中 vi 必須排在 vj 之前。構造拓撲序列的過程稱為拓撲排序。
顯然乙個aov網存在拓撲序列,當且僅當它不存在迴路。乙個存在拓撲序列的aov網路的拓撲序列不唯一。
下面兩個序列都是上圖aov網路的拓撲序列:
c1,c2,c3,c4,c5,c6,c7,c8,c9,c10
c2,c1,c4,c3,c6,c8,c5,c7,c10,c9
任何無迴路aov網n都可以做出拓撲序列,方法很簡單:
如果剩下入度非0的頂點,就說明中有迴路,不存在拓撲序列。
頂點之間的制約關係決定了頂點的入度。入度是乙個整數,用乙個整數表就能記錄所有頂點的入度。下面演算法裡用乙個表indegree,以頂點為下標。初始時,將表中各元素設定為對應的圖中頂點的入度。在隨後的計算中,一旦選中乙個頂點,就可以根據其出邊的情況將其鄰接點的入度分別減1。
這裡又出現了另一問題:工作中需要反覆找出入度為0的頂點。通過掃瞄indegree的方法,需要花費線性時間,效率低。實際上,只有入度減1操作有可能把頂點的入度變成0,如果這時記下這種頂點,後面需要頂點時就可以直接取用了。
為了處理這類情況,人們提出了一種技巧:在indegree裡維持乙個「0度錶",表中記錄當時已知的所有入度為0但還沒有處理的頂點。具體做法是:用乙個變數zerov記錄「第乙個"入度為0的頂點的下標;用表元素indegree[zerov]記錄下乙個入度為0的頂點的
下標;如此類推。如果最後乙個入度為0的頂點的下標是v,就在indegree[v]中存入-1,表示「0度錶"到此結束。
這個「0度錶"就像在indegree裡儲存了乙個頂點棧:變數zer記錄棧頂的位置(下標),-1表示棧結束。如果發現新的0度頂點,例如v,就把當時的zerov值存入indegree[v],然後把v存入zerovo這相當於將v入棧。如果要選乙個0度元素,就用zerov的值,並把zerov修改為indegree[zerov]的值(對應於棧元素的彈出)。
函式topological_sort的基本工作過程是:
def toposort(graph):
vnum=graph.vertex_num()
indegree,toposeq=[0]*vnum,
zerov=-1
for vi in range(vnum): #建立初始的入度表
for v,w in graph.out_edges(vi):
indegree[v]+=1
for vi in range(vnum): #建立初始的0度錶
if indegree[vi]==0:
indegree[vi]=zerov
zerov=vi
for n in range(vnum):
if zerov==-1: #沒有入度為0的節點,不存在拓撲序列
return false
vi=zerov #從0度錶彈出頂點vi
zerov=indegree[zerov]
for v,w in graph.out_edges(vi): #檢查vi的出邊
indegree[v]-=1
if indegree[v]==0:
indegree[v]=zerov
zerov=v
return toposeq
拓撲排序與AOV
在乙個表示工程的有向圖中,用頂點表示活動,用弧表示活動之間的優先關係,稱這樣的有向圖為頂點表示活動的網,即aov網 activity on vertex network aov網中的弧表示活動之間存在某種制約關係。aov網中不能出現迴路。測試aov網是否存在迴路的方法就是對aov網進行拓撲排序。設g...
AOV網 拓撲排序
aov網路 拓撲排序 前面說了兩個有環的應用 有環 最小生成樹 普利姆演算法,克魯斯卡爾演算法 有環 最短路徑 迪傑斯特拉演算法,弗洛伊德演算法 現在我們說下沒環的圖 在乙個有向圖中,用頂點表示活動,用邊表示頂點活動之間的優先關係,這樣的網我們叫aov網 activity on vertex net...
初識AOV拓撲排序
首先先引入一段概念 在乙個表示工程的有向圖中,用頂點表示活動,用弧表示活動之間的優先關係。這樣的有向圖為頂點表示活動的網,我們稱為aov網 activity on vertex network 程式語言 以c語言為例 中定義為 在乙個有向圖中,若用頂點代表活動,邊代表活動間先後關係,稱該有向圖為頂點...