部落格254 演算法 拓撲排序

2021-10-06 10:57:22 字數 2347 閱讀 9338

內容:記錄一種特殊的排序:拓撲排序

理論作用:

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 ...