假設初始狀態是圖中全部頂點不曾被訪問,則深度優先搜索可從圖中某個頂點發v 出發,訪問此頂點,而後依次從v 的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中全部和v 有路徑相通的頂點都被訪問到;若此時圖中尚有頂點未被訪問,則另選圖中一個不曾被訪問的頂點做起始點,重複上述過程,直至圖中全部頂點都被訪問到爲止。php
以以下圖的無向圖G5爲例,進行圖的深度優先搜索:
html
G5git
搜索過程:
web
假設從頂點v1 出發進行搜索,在訪問了頂點v1 以後,選擇鄰接點v2。由於v2 不曾訪問,則從v2 出發進行搜索。依次類推,接着從v4 、v8 、v5 出發進行搜索。在訪問了v5 以後,因爲v5 的鄰接點都已被訪問,則搜索回到v8。因爲一樣的理由,搜索繼續回到v4,v2 直至v1,此時因爲v1 的另外一個鄰接點未被訪問,則搜索又從v1 到v3,再繼續進行下去由此,獲得的頂點訪問序列爲:數組
顯然,這是一個遞歸的過程。爲了在遍歷過程當中便於區分頂點是否已被訪問,需附設訪問標誌數組visited[0:n-1], ,其初值爲FALSE ,一旦某個頂點被訪問,則其相應的份量置爲TRUE。
廣度優先搜索(Breadth_First Search) 遍歷相似於樹的按層次遍歷的過程。數據結構
假設從圖中某頂點v 出發,在訪問了v 以後依次訪問v 的各個不曾訪問過和鄰接點,而後分別從這些鄰接點出發依次訪問它們的鄰接點,並使「先被訪問的頂點的鄰接點」先於「後被訪問的頂點的鄰接點」被訪問,直至圖中全部已被訪問的頂點的鄰接點都被訪問到。若此時圖中尚有頂點未被訪問,則另選圖中一個不曾被訪問的頂點做起始點,重複上述過程,直至圖中全部頂點都被訪問到爲止。換句話說,廣度優先搜索遍歷圖的過程當中以v 爲起始點,由近至遠,依次訪問和v 有路徑相通且路徑長度爲1,2,…的頂點。學習
對圖以下圖所示無向圖G5 進行廣度優先搜索遍歷:ui
廣度搜索過程:
.net
首先訪問v1 和v1 的鄰接點v2 和v3,而後依次訪問v2 的鄰接點v4 和v5 及v3 的鄰接點v6 和v7,最後訪問v4 的鄰接點v8。因爲這些頂點的鄰接點均已被訪問,而且圖中全部頂點都被訪問,由些完成了圖的遍歷。獲得的頂點訪問序列爲:設計
v1→v2 →v3 →v4→ v5→ v6→ v7 →v8
和深度優先搜索相似,在遍歷的過程當中也須要一個訪問標誌數組。而且,爲了順次訪問路徑長度爲二、三、…的頂點,需附設隊列以存儲已被訪問的路徑長度爲一、二、… 的頂點。
DFS的思想:
深度優先搜索所遵循的策略就是儘量「深」的在圖中進行搜索,對於圖中某一個頂點V,若是它還有相鄰的頂點且未被訪問,則訪問此頂點。若是找不到,則返回到上一個頂點。這一過程一直進行直到全部的頂點都被訪問爲止。 DFS能夠搜索出從某一個頂點到另外的一個頂點的全部路徑。 因爲要進行返回的操做,咱們採用的是遞歸的方法。
鄰接表:
鄰接表是圖的一種鏈式存儲結構。在鄰接表中,對圖中的每一個頂點vi創建一個單鏈表,把魚vi相鄰的頂點放在這個鏈表中。
參考代碼:Java實現無向圖鄰接表
(statistics.sh腳本的運行結果截圖)
上週無錯題
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 0/0 | 0/0 | |
第二週 | 800/800 | 2/2 | 18/18 | |
第三週 | 600/1400 | 3/5 | 22/40 | |
第四周 | 700/1300 | 3/8 | 22/62 | |
第五週 | 400/1700 | 3/11 | 22/84 | |
第六週 | 200/1900 | 2/13 | 20/94 | |
第七週 | 400/2300 | 2/15 | 20/114 | |
第八週 | 600/2900 | 2/17 | 20/134 | |
第九周 | 400/2300 | 2/19 | 20/154 |