內容:記錄一種特殊的排序:拓撲排序
理論作用:
1、用於判斷圖中是否存在環
2、用於求出一種不彼此依賴的執行順序
實際舉例:
1、用於編譯器判斷檔案是否迴圈引用
2、用於實際生產判斷元件聯動是否成環?
(比如乙個控扭依賴某乙個,某乙個又剛好依賴它)
拓撲排序思路:
1、將剛開始入度為0的點入棧
2、對棧中的結點依次出棧,每次對出棧的結點將它指向的結點的入度-
1,然後如果入度為0則入棧
3、一直迴圈直到結束,可以得出乙個不依賴執行的順序,如果這個過程中,有結點並沒有入過棧,則
證明成環了
**:
/*
拓撲排序
*/#define ok 1
#define error 0
#define true 1
#define false 0
#define maxedge 20
#define maxvex 14
#define infinity 65535
typedef
int status;
// 鄰接矩陣結構
typedef
struct
mgraph;
// 鄰接表結構
typedef
struct edgenode /* 邊表結點 */
edgenode;
typedef
struct vertexnode /* 頂點表結點 */
vertexnode, adjlist[maxvex]
;typedef
struct
graphadjlist,
*graphadjlist;
void
createmgraph
(mgraph *g)
/* 構件圖 */
for(i =
0; i < g->numvertexes; i++)}
g->arc[0]
[4]=
1;g->arc[0]
[5]=
1; g->arc[0]
[11]=
1; g->arc[1]
[2]=
1; g->arc[1]
[4]=
1; g->arc[1]
[8]=
1; g->arc[2]
[5]=
1; g->arc[2]
[6]=
1;g->arc[2]
[9]=
1;g->arc[3]
[2]=
1; g->arc[3]
[13]=
1;g->arc[4]
[7]=
1;g->arc[5]
[8]=
1;g->arc[5]
[12]=
1; g->arc[6]
[5]=
1; g->arc[8]
[7]=
1;g->arc[9]
[10]=
1;g->arc[9]
[11]=
1;g->arc[10]
[13]=
1;g->arc[12]
[9]=
1;g->arc[13]
[3]=
1;}// 利用鄰接矩陣構建鄰接表
void
createalgraph
(mgraph g,graphadjlist *gl)
for(i=
0;i)/* 建立邊表 */}}
}//拓撲排序,若gl無迴路,則輸出拓撲排序序列並返回1,若有迴路返回0。
status topologicalsort
(graphadjlist gl)
}printf
("\n");
if(count < gl->numvertexes)
return error;
else
return ok;
}int
main
(void
)
書籍推薦:《大話資料結構》
理由:
1、提供**,易於理解
2、由簡單到難高階,過度平滑
3、提供**例項
拓撲排序演算法
對許多資料結構教材實在不滿意,至少我是看不懂 至於拓撲排序演算法,教材上那些偽 真真教人頭暈。只寫了幾個struct結構,我根本看不出這是鄰接表。如果給出乙個清晰明了的圖,一切不就簡單了?總之,關鍵就是建立乙個鄰接表。然後利用這個表進行拓撲排序。邊表結點宣告 typedef struct edgen...
拓撲排序演算法
對乙個 有向無環圖 directed acyclic graph簡稱dag g進行拓撲排序,是將g中所有頂點排成乙個線性序列,使得圖中任意一對頂點u和v,乙個有向無環圖的拓撲序列不是唯一的 進行拓撲排序的演算法並不複雜 1 在有向圖中選乙個沒有前驅 入度為0 的頂點且輸出之 2 從圖中刪除該頂點及它...
演算法 拓撲排序
定義 應用 有向圖來表示,圖中的頂點代表活動 子工程 圖中的有向邊代表活動的先後關係,即有向邊的起點的活動是終點活動的前序活動,只有當起點活動完成之後,其終點活動才能進行。通常,我們把這種頂點表示活動 邊表示活動間先後關係的有向圖稱做頂點活動網 activity on vertex network ...