1. 程式人生 > >演算法導論22.4拓撲排序 練習總結

演算法導論22.4拓撲排序 練習總結

22.4-1 給出演算法 TOPOLOGICAL-SORT 運行於圖 22-8 上時所生成的結點次序。這裡的所有假設和練習 22.3-2 一樣。

ANSWER:


22.4-2 請給出一個線性時間的演算法,演算法的輸入為一個有向無環圖 G = (V, E) 以及兩個結點 s 和 t,演算法的輸出是從結點 s 到結點 t 之間的簡單路徑的數量。例如,對於圖 22-8 所示的有向無環圖,從結點 p 到結點 v 一共有 4 條簡單路徑,分別是 pov、poryv、posryv 和 psryv。(本題僅要求計數簡單路徑的條數,而不要求將簡單路徑本身列舉出來。)

ANSWER:給結點附加一個計數屬性time,初始化 t.time = 1,其它的 time 均為 0 ,以 s 為源結點進行 DFS,一旦搜尋到 t,則 t 馬上著黑色(即不繼續搜尋 t 的後代)。每當結束一個結點的搜尋,則該結點的 time 屬性 = 該結點所指向的所有結點的 time 之和。最後 s.time 即路徑條數。

如圖 22-8 的 p 到 v,最後 v.time = 1, y.time = 1, r.time = 1, s.time = 1, o.time = 1, p.time。

22.4-3 給出一個演算法來判斷給定無向圖 G = (V, E) 是否包含一個環路。演算法執行時間應該在 O(V) 數量級,且與 |E| 無關。

ANSWER:利用DFS搜尋無向圖 G,如果搜尋過程發現與某一結點相連的結點部位白色,則無向圖 G 中存在環。即若圖中出現後向邊,則出現環。

對於時間複雜度,可以證明若無向圖 G 無環,則 |E| < |V|,所以時間複雜度為 O(V)。

22.4-4 證明或反證下述論斷:如果有向圖 G 包含環路,則在演算法 TOPOLOGICAL-SORT(G) 所生成的結點序列裡,圖 G 中與所生成序列不一致的“壞”邊的條數最少。

ANSWER:

22.4-5 在有向無環圖 G =(V, E) 上執行拓撲排序還有一種辦法,就是重複尋找入度為 0 的結點,輸出該結點,將該結點及從其發出的邊從圖中刪除。請解釋如何在 O(V+E) 的時間內實現這種思想。如果圖 G 包含環路,將會發生什麼情況?

ANSWER:首先利用DFS在O(V+E)時間內記錄每個結點的入度。然後在每次刪除結點後更新每個結點的入度。刪除結點時間為O(V),更新結點入度時間為O(E),所以總時間為O(V+E)。

如果圖G包含環路,環路中的結點的入度會均大於0,都無法刪除。