1. 拓撲排序主要有兩種演算法:方法1:《演算法導論》上給出的dfs+時間戳;方法2:求頂點入度+貪心演算法。
2. 兩種演算法的**分別如下:
view code
13. 有人說利用dfs做拓撲排序演算法有錯,但是本人目前沒發現這個演算法有什麼錯誤。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 }
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.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最...