22.4-1 給出演算法 topological-sort 執行於圖 22-8 上時所生成的結點次序。這裡的所有假設和練習 22.3-2 一樣。
22.4-2 請給出乙個線性時間的演算法,演算法的輸入為乙個有向無環圖 g = (v, e) 以及兩個結點 s 和 t,演算法的輸出是從結點 s 到結點 t 之間的簡單路徑的數量。例如,對於圖 22-8 所示的有向無環圖,從結點 p 到結點 v 一共有 4 條簡單路徑,分別是 pov、poryv、posryv 和 psryv。(本題僅要求計數簡單路徑的條數,而不要求將簡單路徑本身列舉出來。)
如圖 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,都無法刪除。
演算法導論 排序演算法總結
從六月初開始看演算法導論,陸陸續續看了有2個月了,但實際看的時間只有半個月左右。這期間都忙著找導師 期末考試,同時還回家修養了十來天。真正專心的看演算法是在離家返校後,由於沒有考試和作業的煩惱,天天都沉浸在演算法中,感覺效率較高。這段時間學到的東西較多,下面來總結一下 比較排序有 插入排序法 合併排...
演算法導論 22 4 5 用佇列實現拓撲排序
題目 在乙個有向無迴路圖g v,e 上,執行拓撲排序的另一種方法是重複地尋找乙個入度為0的頂點,將該點輸出,並將該頂點及其所有的出邊從圖中刪除。解釋如何來實現這一想法,才能使得它的執行時間為o v e 如果g中包含迴路的話,這個演算法在執行時會發生什麼?思考 初始時,所有入度為0的頂點入佇列 whi...
演算法導論 鄰接表儲存的拓撲排序
在鄰接表儲存結構中,為了便於檢查每個頂點的入度,可在頂點表中增加乙個入度域 id 這樣的鄰接表如下圖所示,這樣只需對由n個元素構成的頂點表進行檢查就能找出入度為0的頂點。為了避免對每個入度為0的頂點重複訪問,可用乙個鏈棧來儲存所有入度為0的頂點。在進行拓撲排序前,只要對頂點表進行一次掃瞄,便可將所有...