拓撲排序
定義:由某個幾何上的一個偏序得到這個集合上的全序,這個操作稱爲拓撲排序。
偏序->全序:增加了原來偏序中沒有的優先關係(保留了原來的偏序關係,對於新增加的優先關係,沒有先後順序要求)。
沒有前驅的元素,說明沒有先決條件;
(多個沒有前驅的元素誰在前都行,怎麼排都不影響原來的偏序關係)
拓撲排序的步驟:
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);
}
}
}
}