本章會先對圖的深度優先搜索和廣度優先搜索進行介紹,而後再給出C/C++/Java的實現。html
目錄
1. 深度優先搜索的圖文介紹
1.1 深度優先搜索介紹
1.2 深度優先搜索圖解
2. 廣度優先搜索的圖文介紹
2.1 廣度優先搜索介紹
2.2 廣度優先搜索圖解
3. 搜索算法的源碼java轉載請註明出處:http://www.cnblogs.com/skywang12345/git
更多內容:數據結構與算法系列 目錄github
1. 深度優先搜索介紹算法
圖的深度優先搜索(Depth First Search),和樹的先序遍歷比較相似。 數據結構
它的思想:假設初始狀態是圖中全部頂點均未被訪問,則從某個頂點v出發,首先訪問該頂點,而後依次從它的各個未被訪問的鄰接點出發深度優先搜索遍歷圖,直至圖中全部和v有路徑相通的頂點都被訪問到。 若此時尚有其餘頂點未被訪問到,則另選一個未被訪問的頂點做起始點,重複上述過程,直至圖中全部頂點都被訪問到爲止。 ui
顯然,深度優先搜索是一個遞歸的過程。spa
2. 深度優先搜索圖解htm
2.1 無向圖的深度優先搜索blog
下面以"無向圖"爲例,來對深度優先搜索進行演示。
對上面的圖G1進行深度優先遍歷,從頂點A開始。
第1步:訪問A。
第2步:訪問(A的鄰接點)C。
在第1步訪問A以後,接下來應該訪問的是A的鄰接點,即"C,D,F"中的一個。但在本文的實現中,頂點ABCDEFG是按照順序存儲,C在"D和F"的前面,所以,先訪問C。
第3步:訪問(C的鄰接點)B。
在第2步訪問C以後,接下來應該訪問C的鄰接點,即"B和D"中一個(A已經被訪問過,就不算在內)。而因爲B在D以前,先訪問B。
第4步:訪問(C的鄰接點)D。
在第3步訪問了C的鄰接點B以後,B沒有未被訪問的鄰接點;所以,返回到訪問C的另外一個鄰接點D。
第5步:訪問(A的鄰接點)F。
前面已經訪問了A,而且訪問完了"A的鄰接點B的全部鄰接點(包括遞歸的鄰接點在內)";所以,此時返回到訪問A的另外一個鄰接點F。
第6步:訪問(F的鄰接點)G。
第7步:訪問(G的鄰接點)E。
所以訪問順序是:A -> C -> B -> D -> F -> G -> E
2.2 有向圖的深度優先搜索
下面以"有向圖"爲例,來對深度優先搜索進行演示。
對上面的圖G2進行深度優先遍歷,從頂點A開始。
第1步:訪問A。
第2步:訪問B。
在訪問了A以後,接下來應該訪問的是A的出邊的另外一個頂點,即頂點B。
第3步:訪問C。
在訪問了B以後,接下來應該訪問的是B的出邊的另外一個頂點,即頂點C,E,F。在本文實現的圖中,頂點ABCDEFG按照順序存儲,所以先訪問C。
第4步:訪問E。
接下來訪問C的出邊的另外一個頂點,即頂點E。
第5步:訪問D。
接下來訪問E的出邊的另外一個頂點,即頂點B,D。頂點B已經被訪問過,所以訪問頂點D。
第6步:訪問F。
接下應該回溯"訪問A的出邊的另外一個頂點F"。
第7步:訪問G。
所以訪問順序是:A -> B -> C -> E -> D -> F -> G
1. 廣度優先搜索介紹
廣度優先搜索算法(Breadth First Search),又稱爲"寬度優先搜索"或"橫向優先搜索",簡稱BFS。
它的思想是:從圖中某頂點v出發,在訪問了v以後依次訪問v的各個不曾訪問過的鄰接點,而後分別從這些鄰接點出發依次訪問它們的鄰接點,並使得「先被訪問的頂點的鄰接點先於後被訪問的頂點的鄰接點被訪問,直至圖中全部已被訪問的頂點的鄰接點都被訪問到。若是此時圖中尚有頂點未被訪問,則須要另選一個不曾被訪問過的頂點做爲新的起始點,重複上述過程,直至圖中全部頂點都被訪問到爲止。
換句話說,廣度優先搜索遍歷圖的過程是以v爲起點,由近至遠,依次訪問和v有路徑相通且路徑長度爲1,2...的頂點。
2. 廣度優先搜索圖解
2.1 無向圖的廣度優先搜索
下面以"無向圖"爲例,來對廣度優先搜索進行演示。仍是以上面的圖G1爲例進行說明。
第1步:訪問A。
第2步:依次訪問C,D,F。
在訪問了A以後,接下來訪問A的鄰接點。前面已經說過,在本文實現中,頂點ABCDEFG按照順序存儲的,C在"D和F"的前面,所以,先訪問C。再訪問完C以後,再依次訪問D,F。
第3步:依次訪問B,G。
在第2步訪問完C,D,F以後,再依次訪問它們的鄰接點。首先訪問C的鄰接點B,再訪問F的鄰接點G。
第4步:訪問E。
在第3步訪問完B,G以後,再依次訪問它們的鄰接點。只有G有鄰接點E,所以訪問G的鄰接點E。
所以訪問順序是:A -> C -> D -> F -> B -> G -> E
2.2 有向圖的廣度優先搜索
下面以"有向圖"爲例,來對廣度優先搜索進行演示。仍是以上面的圖G2爲例進行說明。
第1步:訪問A。
第2步:訪問B。
第3步:依次訪問C,E,F。
在訪問了B以後,接下來訪問B的出邊的另外一個頂點,即C,E,F。前面已經說過,在本文實現中,頂點ABCDEFG按照順序存儲的,所以會先訪問C,再依次訪問E,F。
第4步:依次訪問D,G。
在訪問完C,E,F以後,再依次訪問它們的出邊的另外一個頂點。仍是按照C,E,F的順序訪問,C的已經所有訪問過了,那麼就只剩下E,F;先訪問E的鄰接點D,再訪問F的鄰接點G。
所以訪問順序是:A -> B -> C -> E -> F -> D -> G
這裏分別給出"鄰接矩陣無向圖"、"鄰接表無向圖"、"鄰接矩陣有向圖"、"鄰接表有向圖"的C/C++/Java搜索算法源碼。這裏就再也不對源碼進行說明,please RTFSC;參考源碼中的註釋進行了解。
1. C語言源碼
1.1 鄰接矩陣實現的無向圖(matrixudg.c)
1.2 鄰接表實現的無向圖(listudg.c)
1.3 鄰接矩陣實現的有向圖(matrixdg.c)
1.4 鄰接表實現的有向圖(listdg.c)
2. C++源碼
2.1 鄰接矩陣實現的無向圖(MatrixUDG.cpp)
2.2 鄰接表實現的無向圖(ListUDG.cpp)
2.3 鄰接矩陣實現的有向圖(MatrixDG.cpp)
2.4 鄰接表實現的有向圖(ListDG.cpp)
3. Java源碼
3.1 鄰接矩陣實現的無向圖(MatrixUDG.java)
3.2 鄰接表實現的無向圖(ListUDG.java)
3.3 鄰接矩陣實現的有向圖(MatrixDG.java)
3.4 鄰接表實現的有向圖(ListDG.java)