一,幾種基本的方法
1.無前趨的的頂點優先拓撲排序
思路:在有向圖建立完成之後,維護兩個點集,乙個是當前出度為0的點集,記為①,另乙個是出度不為0 的點集,記為②,以及乙個記錄各個點出度的陣列。首先遍歷一遍圖的全部邊,初始化所有點的出度,然後出度為0的點依次 入①,然後將①中的點分別出列,每次出列都需要更新各個點的出度,即把所有跟出列的點鄰接的點出度-1(有多條邊,則相應減掉邊數,一般簡單圖不會有多重邊),直至①變成空集。這個時候,如果②也變成了空集,證明排序成功,否則,原圖不存在拓撲排序(圖中有環)。最終的排序結果就是從①中出列的點的逆序。
2.無後繼的的頂點優先拓撲排序
思路:跟1的方法類似,不過這次是維護根據點的入度進行統計。在有向圖建立完成之後,維護兩個點集,乙個是當前入度為0的點集,記為①,另乙個是入度不為0 的點集,記為②,以及乙個記錄各個點入度的陣列。首先遍歷一遍圖的全部邊,初始化所有點的入度,然後入度為0的點依次 入①,然後將①中的點分別出列,每次出列都需要更新各個點的入度,即把所有跟出列的點鄰接的點入度-1(有多條邊,則相應減掉邊數,一般簡單圖不會有多重邊),直至①變成空集。這個時候,如果②也變成了空集,證明排序成功,否則,原圖不存在拓撲排序(圖中有環)。最終的排序結果就是從①中出列的點的順序。
3.基於dfs遞迴的拓撲排序
思路:從圖的起點開始進行深度優先搜尋,在搜尋過程中,把沒有後繼(相當於出度為0)的點出列(這個過程中,已經出列的點不算是它的前繼點,相當於刪除了該點),點的出列順序就是拓撲排序結果的逆序。
下面分析一些hdu上的題目來考察這三個方法的異同。
1.前兩種方法本質上是一樣的,只不過乙個得到的是順序,乙個是逆序,這就根據情況和喜好進行判斷,對於關係(a,b)我們直觀上認為在圖中是這樣的 a -> b, 然而,在某些題目中(a,b)的意義可能是 a>b,這就不大符合我們的直觀理解(一般認為圖的上端好,大……),不過這都不影響排序結果,各求所需就好。
2.未經優化的dfs拓撲排序,在圖存在環的時候會進入死迴圈,因此,要注意確保圖沒有環,或者最好進行優化再使用。
3.維護出度為0以及dfs拓撲得到的結果是逆序!
4.拓撲排序結果不一定唯一,注意題目要求。
5.dfs拓撲需要知道圖的起點,否則不能深搜整個圖,也就沒有得到完整的拓撲排序結果。
6.在維護點集的拓撲中,加入當前出度(入度)為0的點大於1個,則得到的拓撲排序結果不唯一
排序的幾種方法
三種排序 選擇排序,氣泡排序,插入排序 的總結 1.選擇排序 1 public class demo3 遍歷排序前的數值 for int i 0 i num.length 1 i 如果最小值的標號未改變,代表本身已是最小值,否則交換數值 if min i 遍歷排序後的數值 for int i 0 i...
排序的幾種方法
三種排序 選擇排序,氣泡排序,插入排序 的總結 1.選擇排序 1 public class demo3 遍歷排序前的數值 for int i 0 i num.length 1 i 如果最小值的標號未改變,代表本身已是最小值,否則交換數值 if min i 遍歷排序後的數值 for int i 0 i...
排序的幾種方法回顧
氣泡排序 氣泡排序 是一種交換排序。兩兩比較待排序元素,發現2個元素次序相反則進行交換,直到沒有反序的元素為止。氣泡排序 通過無序區中相鄰記錄的關鍵字間的比較和位置的交換,使關鍵字最小的元素如氣泡似的逐步上浮直水面。有序區逐漸擴大,無序區逐漸縮小。lists 1,9,3,5,2,0,8,7,6,4 ...