aov網路用有向圖的頂點表示活動,頂點之間的有向邊表示活動間的先後關係,這種有向圖稱為頂點表示活動網路,簡稱aov網路。
當限制各個活動只能序列進行時,可以將aov網路中所有頂點排列成乙個線性序列,且vi必須在vj之前,我們就稱這個線性序列為拓撲序列,把對aov網構造拓撲序列的操作稱為拓撲排序。
拓撲排序演算法:
1、在網中選擇乙個入度為0的頂點並輸出
2、刪除該頂點和所有由它發出的邊
3、重複操作,直到沒有入度為0的頂點
許多情況下入度為0的頂點不止乙個,這樣就可以給出多種拓撲排序,且每種都可以保證先後順序。
鄰接矩陣中,入度由這個頂點對應列上1的個數決定,所以演算法框架為:
1、取1作為第乙個新序號
2、找乙個沒有得到新序號的全0矩陣,若沒有則停止尋找,如果所有列都得到了新序號,拓撲排序完成,否則說明有向圖中有環存在,無法形成拓撲排序。
3、把新序號賦給找到的列,並將該列對應的頂點輸出
4、將找到的列所對應的行置全0
5、新序號+1,重複執行2~5
#include
#include
#include
typedef
char vertextype;
typedef
int edgetype;
typedef
struct
mgraph;
void
createmgraph
(mgraph *g)
for(i=
0;ivexnumber;i++)}
for(k=
0;kvexnumber;k++)}
void
toposorta
(mgraph *g,
int n)
v=1;//新序號變數置1
for(k=
0;k(t==1)
//找到第j列為全0列}}
if(j!=n)
}else
break;}
}if(vprintf
("\n the network has a cycle\n");
}
typedef
char vertextype;
typedef
int edgetype;
typedef
struct edgenodeedgenode;
typedef
struct
vexnode;
vexnode ga[n]
;//頂點表
void
toposortb
(vexnode ga)
}while
(top!=-1
) p=p->next;
//找下一條邊 }}
if(mprintf
("\n the network has a cycle\n");
}
資料結構 拓撲排序
設g v,e 是乙個具有n個頂點的有向圖,v中的頂點序列v0,v1,v2,vn 1如果滿足下列條件 若從vi到vj有一條路徑,則在頂點序列中頂點vi必定在vj之前,這樣的序列稱為拓撲序列。對乙個有向圖構造拓撲序列的過程稱為拓撲排序 topological sort 顯然,每乙個可以構造出不止乙個拓撲...
資料結構 拓撲排序
拓撲排序是圖中重要的操作之一,在實際中應用很廣泛.再aov網中,不應該出現有向環路,因為有環意味著某項活動以自己作為先決條件,這樣就進入了死迴圈.因此,對給定的aov網應該首先判定網中是否存在環 檢測的辦法就是對有向圖進行拓撲排序,拓撲排序是指照有向圖給出的次序關係,將圖中頂點排成乙個線性序列,對於...
資料結構之拓撲排序
乙個簡單的求拓撲排序思路是 先找出任意乙個沒有入邊的頂點。然後列印出該頂點,並將它和它的邊一起從圖中刪除。然後,我們對圖的其餘部分採用同樣的方法處理。相應的我們可以定義乙個indegree 入度陣列 儲存所有頂點的入度。具體實現如下 鄰接表 define crt secure no warnings...