圖的遍曆之 深度優先搜尋和廣度優先搜尋_graph

來源:互聯網
上載者:User

本章會先對圖的深度優先搜尋和廣度優先搜尋進行介紹,然後再給出C/C++/Java的實現。

目錄 
1. 深度優先搜尋的圖文介紹 
1.1 深度優先搜尋介紹 
1.2 深度優先搜尋圖解 
2. 廣度優先搜尋的圖文介紹 
2.1 廣度優先搜尋介紹 
2.2 廣度優先搜尋圖解 
3. 搜尋演算法的源碼

轉載請註明出處:http://www.cnblogs.com/skywang12345/

更多內容:資料結構與演算法系列 目錄

深度優先搜尋的圖文介紹

1. 深度優先搜尋介紹

圖的深度優先搜尋(Depth First Search),和樹的先序遍曆比較類似。

它的思想:假設初始狀態是圖中所有頂點均未被訪問,則從某個頂點v出發,首先訪問該頂點,然後依次從它的各個未被訪問的鄰接點出發深度優先搜尋遍曆圖,直至圖中所有和v有路徑相通的頂點都被訪問到。 若此時尚有其他頂點未被訪問到,則另選一個未被訪問的頂點作起始點,重複上述過程,直至圖中所有頂點都被訪問到為止。

顯然,深度優先搜尋是一個遞迴的過程。

2. 深度優先搜尋圖解

2.1 無向圖的深度優先搜尋

下面以"無向圖"為例,來對深度優先搜尋進行示範。

對上面的圖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)




http://www.cnblogs.com/skywang12345/p/3711483.html






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.