問題1:對圖的深度遍歷和廣度遍歷的區別不太理解。html
深度優先搜索(Depth_Fisrst Search)遍歷相似於樹的先根遍歷,是樹的先根遍歷的推廣。
假設初始狀態是圖中全部頂點不曾被訪問,則深度優先搜索可從圖中某個頂點發v 出發,訪問此頂點,而後依次從v 的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中全部和v 有路徑相通的頂點都被訪問到;若此時圖中尚有頂點未被訪問,則另選圖中一個不曾被訪問的頂點做起始點,重複上述過程,直至圖中全部頂點都被訪問到爲止。java
以以下圖的無向圖G5爲例,進行圖的深度優先搜索:
搜索過程:
假設從頂點v1 出發進行搜索,在訪問了頂點v1 以後,選擇鄰接點v2。由於v2 不曾訪問,則從v2 出發進行搜索。依次類推,接着從v4 、v8 、v5 出發進行搜索。在訪問了v5 以後,因爲v5 的鄰接點都已被訪問,則搜索回到v8。因爲一樣的理由,搜索繼續回到v4,v2 直至v1,此時因爲v1 的另外一個鄰接點未被訪問,則搜索又從v1 到v3,再繼續進行下去由此,獲得的頂點訪問序列爲:
顯然,這是一個遞歸的過程。爲了在遍歷過程當中便於區分頂點是否已被訪問,需附設訪問標誌數組visited[0:n-1], ,其初值爲FALSE ,一旦某個頂點被訪問,則其相應的份量置爲TRUE。git
+廣度優先搜索(Breadth_First Search) 遍歷相似於樹的按層次遍歷的過程。
假設從圖中某頂點v 出發,在訪問了v 以後依次訪問v 的各個不曾訪問過和鄰接點,而後分別從這些鄰接點出發依次訪問它們的鄰接點,並使「先被訪問的頂點的鄰接點」先於「後被訪問的頂點的鄰接點」被訪問,直至圖中全部已被訪問的頂點的鄰接點都被訪問到。若此時圖中尚有頂點未被訪問,則另選圖中一個不曾被訪問的頂點做起始點,重複上述過程,直至圖中全部頂點都被訪問到爲止。換句話說,廣度優先搜索遍歷圖的過程當中以v 爲起始點,由近至遠,依次訪問和v 有路徑相通且路徑長度爲1,2,…的頂點。數組
對圖以下圖所示無向圖G5 進行廣度優先搜索遍歷:
廣度搜索過程:
首先訪問v1 和v1 的鄰接點v2 和v3,而後依次訪問v2 的鄰接點v4 和v5 及v3 的鄰接點v6 和v7,最後訪問v4 的鄰接點v8。因爲這些頂點的鄰接點均已被訪問,而且圖中全部頂點都被訪問,由些完成了圖的遍歷。獲得的頂點訪問序列爲:
v1→v2 →v3 →v4→ v5→ v6→ v7 →v8
和深度優先搜索相似,在遍歷的過程當中也須要一個訪問標誌數組。而且,爲了順次訪問路徑長度爲二、三、…的頂點,需附設隊列以存儲已被訪問的路徑長度爲一、二、… 的頂點。數據結構
本週沒有錯題。學習
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 6/6 | |
第二週 | 612/612 | 1/2 | 18/24 | |
第三週 | 516/1128 | 1/3 | 16/40 | |
第四周 | 702/1830 | 2/5 | 16/56 | |
第五週 | 1926/3756 | 1/6 | 18/74 | |
第六週 | 948/4304 | 1/7 | 18/92 | |
第七週 | 771/5075 | 1/8 | 20/112 | |
第八週 | 1204/6279 | 1/9 | 20/132 | |
第九周 | 3772/10051 | 1/10 | 20/152 |