拓撲排序

拓撲排序

定義:由某個幾何上的一個偏序得到這個集合上的全序,這個操作稱爲拓撲排序。

偏序->全序:增加了原來偏序中沒有的優先關係(保留了原來的偏序關係,對於新增加的優先關係,沒有先後順序要求)

沒有前驅的元素,說明沒有先決條件;

(多個沒有前驅的元素誰在前都行,怎麼排都不影響原來的偏序關係)

 

拓撲排序的步驟

1.      在有向圖中選一個沒有前驅的元素,放入集合S中;

2.      從S中取出元素Vi,刪除Vi對其他優先元素的影響。

3.      重複上面兩個步驟,直至全部定點均以輸出。(如果頂點並沒有全部輸出,但卻不存在無前驅的頂點,說明有向圖中存在環)


沒有前驅的元素也就是入度爲0的元素

初始化元素的入度值,初始化集合S

While(S不爲空)

任取一元素Vi,對所有Vi->Vj  對Vj的入度值-1

If入度Vj=0 則加入S

用鄰接表表示

0 V1     3   1   2

1  V2

2  V3     4   1

3  V4     4

4  V5

5  V6      3   4

算法實現

1.計算入度值

for(v=0;v<G.vexnum;++v){

        p=G.vertices[v].firstarc;

        while(p){

                 indegree(p->adjvex)+=1;

                 p=p->nextarc;

        }

}

2.拓撲排序算法

status TopologicalSort(ALGraph){

findingree(G,indegree);

initstack(S);

for(v=0;v<G.vexnum;v++){

        if(!indegree[v])

        push(S,v);//入度爲零的元素進棧

        count=0;//對輸入的頂點計數

        while(!stackEmpty(S)){//當S不爲空時 任意取出一個元素

                 pop(S,v);

                 cout<<G.vertices[v].data;

                 count=count+1;//每輸出一個頂點,計數器加一

                 for(p=G.vertices[i].firstarc;p;p=p->nextarc){

                         x=p->adjvex;

                         indegree[x]-=1;//對每個鄰接點的入度減一

                         if(indegree[x]==0)//如果入度減爲一的話,則加入S中

                         push(S,x);

                 }

        }

  }

}

 

 

 

 

 

  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章