AOV網路 拓撲排序 拓撲序列

2021-09-02 19:20:50 字數 2343 閱讀 9761

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語言為例 中定義為 在乙個有向圖中,若用頂點代表活動,邊代表活動間先後關係,稱該有向圖為頂點...