1. 程式人生 > >資料結構-圖的應用-拓撲排序

資料結構-圖的應用-拓撲排序

一、基礎知識

1、AOV-網 (Activity On Vertex Network):用頂點表示活動,用弧表示活動之間的優先關係的有向無環圖。

2、AOE-網 (Activity On Edge Network):用頂點表示事件,用邊表示活動,帶權的有向無環圖。

3、拓撲排序:將AOV-網中所有頂點排成一個線性序列(頂點 v_{i} 到 v_{j} 頂點有一條路徑,則該線性序列中 v_{i} 一定在 v_{j} 之前)

二、拓撲排序演算法思想

1、在AOV-網中選取一個無前驅的頂點,並輸出

2、從圖中刪除所有該頂點發出的有向邊

3、重複1,2,直至

  全部頂點已輸出,拓撲排序已完成。

  已經跳出迴圈,但是圖中還有頂點,說明圖中存在環。

三、演算法實現

①求出個頂點的入度存入indegree陣列,並將入度為0的頂點入棧。

②只要棧不空

  將棧頂元素儲存在topo陣列

  並將  v_{i} 頂點的每個鄰接頂點的入度減1,如果此時有入度為0的點,則放入棧中

③無環結束,返回OK

    有環,返回ERROR

 1 Status TopologicalSort(ALGraph G, int topo[])    //有向圖用鄰接表儲存
 2 {
 3     //若G無迴路,則生成G的一個拓撲序列topi[]並返回OK,否則返回ERROR
4 FindInDegree(G, indegree);   //求出各頂點的入度,存放在陣列indegree中 5 InitStack(S); //初始化棧S 6 for(int i=0; i<G.vexnum; i++){   //遍歷indegree,將入度為0的頂點壓入棧中 7 if(indegree[i] == 0){ 8 Push(S, i); 9 } 10 } 11 m=0;
12 while(!StackEmpty(S)){ 13 int i=0; 14 Pop(S, i); //將棧頂元素出棧 15 topo[m]=i; //存入topo序列中 16 ++m; 17 p=G.vertices[i].firstarc; //將P指向 v_{i} 的鄰接點 18 while(p){ //遍歷v_{i}的出度表,將其中存在頂點的入度減1 19 k=p->adjvex; 20 --indegree[k]; 21 if(indegree[k] == 0){ //若入度為0,壓入棧 22 Push(S, k); 23 } 24 p=p->nextarc; 25 } 26 } 27 if(m<G.vexnum) return ERROR; 28 else return OK;