昨天開始學的拓補排序,自己總結了一下拓補排序演算法的思路。
1.首先構造乙個能夠儲存圖的資料型別,能把邊之間的關係存起來。
2.找到這些邊的初始入度為0的頂點,將這些頂點存到乙個陣列當中,我看的這個書當中把這些點存入乙個像棧一樣的陣列,初始化完成之後用這個陣列中的頂點和跟他相關聯的頂點的入度減去1.
3接下來就是拓補排序非常重要的一步,用這些初始入度為0的頂點找到與之相關聯的頂點,把這些頂點的入度減去1之後,如果他們的入度為0,就把他們放入那個類似於棧的陣列(其實這是個for迴圈查詢與當前入度為0的頂點關聯的頂點減去1後入度是否為0),當與乙個頂點相關聯的頂點全部找到之後,他們的入度如果為0就已經放在了類似於棧的陣列當中,下次迴圈開始的時候當然是先用他們(棧的特點)。
4.到最後,如果整個圖的頂點沒有迴路,那麼這個棧最後就會是空的,如果不是空,就說明有迴路。
//用臨接表的形式進行圖的構建
struct node
;struct graph
;graph date[550];
int x[550];//用來儲存拓補排序的最終結果
//用來找到每個頂點的入度,indegree指標指向乙個儲存頂點的陣列
void findnum(graph * it,int * indegree)
for (int i=1;i<=n;++i)
}}
//拓補排序
int tuobu(graph * it)
}//這個for迴圈當中的陣列就是類似用棧,用它來實現棧的作用,剛看的時候感覺好神奇。。。。
all=toplist(it,indegree,top);//最關鍵的函式,用來把每個入度為0的頂點存入到x陣列當中
if (allnext)//for迴圈找到每個入度為0的頂點相關聯的頂點,把他們的入度減1,如果減1後是0,就放入類似於棧的陣列indegree中,再下次使用}}
return nd;
}
第一次寫這麼長得博文,,寫出來的目的就是希望自己以後忘了再看看記起來,,也算是一種總結,可能還有很多不足的地方,希望看到的人多多包涵,多給出意見
資料結構之排序
在待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的 若具有相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的。穩定的排序 時間複雜度 空間複雜度 氣泡排序 最差和平均是o n2 最好是o n 1 雙向氣泡排序 最...
資料結構之排序
package com.small 注意a 0 是否有意思,書上c語言基本都是將a 0 作為哨兵,那麼0號元素不能用,我這裡全部是flag代替 author small leaf public class sort else for j i 1 j high 1 j a high 1 flag 希爾...
資料結構之排序
常用的幾種排序方法 冒泡 插入 選擇 快排 歸併排序 1 冒泡 以公升序為例,也是有兩種思路,1 num 0 依次與後面比較將最小的放到第一位 2 將最大的放到最後一位。我比較習慣用第一種 1 include include using namespace std int main for int ...