拓撲排序的兩種演算法

2022-09-04 03:09:05 字數 3094 閱讀 6574

1. 拓撲排序主要有兩種演算法:方法1:《演算法導論》上給出的dfs+時間戳;方法2:求頂點入度+貪心演算法。

2. 兩種演算法的**分別如下:

view code

1

static

int f[100]=;

2static

int ftime=0;3

//遞迴深度優先搜尋

4 template5

void algraph::dfs()613

for (int i=0;i)

1420}21

delete visited;22}

2324

2526 template27

void algraph::dfs(int vertexnumber,bool

visited)

2838 p=p->pnextedge;39}

40//

每乙個節點訪問結束之後,都記錄其訪問時間。

41 f[vertexnumber]=ftime;

42 ftime++;43}

44//

拓撲排序演算法一的思想是:用dfs遍歷整個圖,記錄各個節點

45//

的完成時間,然後按各個節點的完成時間逆序排列,就得到了

46//

拓撲排序序列

47 template48

void algraph::topological_sort1()

4956 cout<

57int *tp=new

int[vectexno];

58//

按訪問時間逆序排列

59for (int i=0;i)

6063

for (int i=0;i)

6467 cout<

68delete tp;69}

7071

//求乙個圖中所有節點的入度

72 template73

void algraph::findindegree(inout int* &ind)

7485}86

}8788//

拓撲排序2:方法一

89//

首先找到入度為0的節點,訪問這個節點,並將這個節點

90//

的所有出邊的鄰接頂點的入讀減1,訪問這個頂點;下一步

91//

繼續尋找入度為0的頂點,直到所有的節點均訪問玩位置或者

92//

圖中存在環

93//

時間複雜度為:o(v2)

94//

template

95//

void algraph::topological_sort2()

96//

103//

findindegree(indegree);

104//

for (int i=0;i105

//108

//cout<109

//bool *visited=new bool[vectexno];

110//

vectortop;

111//

for (int i=0;i112

//115

//int count=0;

116//

while(count++117

//125//}

126//

if (indexzero>=vectexno)

127//

130//

visited[indexzero]=true;

131//

top.push_back(getdata(indexzero));

132//

edge* pe=m_vertexarray.at(indexzero).padjedges;

133//

while(pe)

134//

138//

}139

//if (count140

//144

//for (int i=0;i145

//148

//cout<149//}

150151

152//

在方案一中,每次尋找節點入度為0的節點,乙個for

153//

迴圈時間複雜度為o(v),改用queue每次將入讀為0的節點

154//

存入佇列,省去了下一步尋找入讀為0的頂點的過程

155 template156

void algraph::topological_sort2()

157164

findindegree(indegree);

165166 queuequ;

167int indexzero=0

;168

//首先將途中所有入讀為0的頂點存入佇列

169for (;indexzero)

170175

}176 vectortop;

177while(!qu.empty())

178190 pe=pe->pnextedge;

191}

192}

193if (top.size()

194198

for (int i=0;i)

199202 cout<

203 }

3. 有人說利用dfs做拓撲排序演算法有錯,但是本人目前沒發現這個演算法有什麼錯誤。

4. 拓撲排序可以做很多事情:如判斷圖中有沒有環(利用方法2);排課程表(比如學c++之前一定要先學習c語言)。

5. 方法2的兩種實現只有細微的差別,實現2更好一點,時間複雜度低,**簡潔。

6. 演算法有不當之處,歡迎指正。

7. 演算法測試使用圖如下:

a b c d e f g分別對應v1 v2 ... v7

兩種常用的排序演算法

本文討論兩種著名且很有用的排序演算法 插入排序,快速排序。插入排序的思想與打牌起牌類似 每次從牌堆裡拿一張牌,插入到已經排好序的牌中。具體演算法描述如下 從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,從該元素開始,從後向前掃瞄表 如果前乙個元素大於後乙個元素,則交換兩個元素的位置 重複...

快速排序的兩種演算法

假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。先將第乙個數當成基準數,然後以i,j當成哨兵分別指向陣列的首尾,第一次讓j先移動,移動到比基準數小的數字時停下,然後讓i移動至比基準數大的數字停下,交換arr i 和arr j 一直遍歷,知道i和j兩個哨兵相遇停止,然後...

氣泡排序演算法的兩種優化

氣泡排序 三種實現,兩種優化 首先,我們先介紹bubblesort 就是氣泡排序,氣泡排序大家應該最熟悉不過了 氣泡排序演算法的運作如下 從後往前 1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最...