1. 程式人生 > >AOV網路與拓撲(一)

AOV網路與拓撲(一)

一、活動網路之AOV:

1、活動網路可以用來描述生產計劃、施工過程、生產流程、程式流程等工程中各子工程的安排問題。活動網路可分為兩種:AOV網路和AOE網路;

2、實際上,可以用有向圖來表示一個工程,在這種有向圖中,用頂點表示活動,用有向邊<u,v>來表示活動u必須先於活動v進行。這種有向圖叫做頂點表示活動的網路(Activity On Vertices),記作AOV網路;

3、在AOV網路中,由於具有傳遞性和反自反性,所以AOV網路不能出現有向環(即有向無環圖DAG)。

綜上,對於給定的AOV網路,必須先判斷它是否是DAG~

二、拓撲排序:

1、判斷有向無環圖的方法是對AOV網路構造它的拓撲有序序列(Topological Order Sequence);

2、構造這種AOV網路全部頂點的拓撲有序序列的運算稱為拓撲排序;

3、一個AOV網路的拓撲有序序列可能不是唯一的;

4、拓撲排序實現方法:

(1)從AOV網路中選擇一個入度為0(即沒有直接前驅)的頂點並輸出;

(2)從AOV網路中刪除該頂點及該頂點發出的所有邊;

(3)重複步驟(1)和(2),直至找不到入度為0的頂點。

經過上述步驟後,有兩種結果:(1)所有的頂點都被輸出,也就是整個拓撲排序完成了;(2)仍有頂點沒有被輸出,只剩下入度不為0的頂點,即存在有環圖。

5、拓撲排序在實現時需要建立一個count陣列,記錄各個頂點的入度:入度為0的頂點就是無前驅的頂點;還需建立一個存放入度為0的頂點的棧,供選擇和輸出無前驅的頂點:只要出現入度為0的頂點,就將它壓入棧中;

6、在演算法實現時,為了建立入度為0的頂點棧,可以不另外分配儲存空間,直接利用儲存頂點入度的count[]陣列;

(1)當頂點i入棧時,將執行棧頂指標的修改:count[i] = top; top = i;

(2)當彈出棧頂頂點時,執行如下操作:j = top; top = count[top];

如上操作,是把count當作一個鏈式棧來看,當count[]中入度為0時,即為top下一個指向的位置,並將當前指標存入count[]中;

Ps:下一篇來具體實現AOV網路的拓撲排序~