1. 程式人生 > >圖的遍歷之 深度優先搜尋和廣度優先搜尋(圖文講解)

圖的遍歷之 深度優先搜尋和廣度優先搜尋(圖文講解)

深度優先搜尋的圖文介紹

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;參考原始碼中的註釋進行了解。

相關推薦

深度搜索與廣度搜索生成樹邊集

}void DFS(AMLGraph G,int v);void DFSTraverse(AMLGraph G ,char start){int v,z;for(v=0;v<G.vexnum;v++)Visited[v]=0;    z=LocateVex(G,start);for(v=0;v<G

深度優先搜尋廣度優先搜尋

1. 深度優先搜尋介紹 圖的深度優先搜尋(Depth First Search),和樹的先序遍歷比較類似。 它的思想:假設初始狀態是圖中所有頂點均未被訪問,則從某個頂點v出發,首先訪問該頂點,然後依次從它的各個未被訪問的鄰接點出發深度優先搜尋遍歷圖,直至圖中所有和v有

【轉載】 深度優先搜尋廣度優先搜尋

【轉載】圖的遍歷之 深度優先搜尋和廣度優先搜尋 原文地址:https://www.cnblogs.com/skywang12345/p/3711483.html 深度優先搜尋的圖文介紹 1. 深度優先搜尋介紹 圖的深度優先搜尋(Depth First Search),和樹的先序

深度優先搜尋廣度優先搜尋(圖文講解

深度優先搜尋的圖文介紹 1. 深度優先搜尋介紹 圖的深度優先搜尋(Depth First Search),和樹的先序遍歷比較類似。 它的思想:假設初始狀態是圖中所有頂點均未被訪問,則從某個頂點v出發,首先訪問該頂點,然後依次從它的各個未被訪問的鄰接點出發

深度優先廣度優先

優先 ges sky 深度優先 們的 老師 ear blog earch 圖的遍歷之深度優先和廣度優先 深度優先遍歷 假設給定圖G的初態是所有頂點均未曾訪問過。在G中任選一頂點v為初始出發點(源點),則深度優先遍歷可定義如下:首先訪問出發點v,並將其標記為已訪問過;然後依

深度優先搜索廣度優先搜索

順序 如果 一個 depth cde ava nbsp github 深度優先搜索遍歷 本章會先對圖的深度優先搜索和廣度優先搜索進行介紹,然後再給出C/C++/Java的實現。 目錄 1. 深度優先搜索的圖文介紹 1.1 深度優先搜索介紹 1.2 深度優先搜索圖解

深度優先搜尋演算法&&廣度優先優先演算法的實現

一.序 和樹的遍歷類似,我們希望從圖中的某一個頂點出發訪問圖中其餘頂點,保證每個頂點只被訪問一次,這一過程叫做圖的遍歷。圖的遍歷演算法是求解圖的連通性問題(最小生成樹),拓撲排序,求關鍵路徑的基礎。 而為了保證同一個頂點不被訪問多次,在遍歷圖的的過程中,必須

數據結構(三十一深度優先

width depth idt 廣度優先遍歷 http 如果 搜索 src 技術分享   圖的遍歷和樹的遍歷類似。圖的遍歷是指從圖中的某個頂點出發,對圖中的所有頂點訪問且僅訪問一次的過程。通常有兩種遍歷次序方案:深度優先遍歷和廣度優先遍歷。   一、深度優先遍歷算法描述  

C++ 深度優先搜尋廣度優先搜尋

7-6 列出連通集 (25 point(s)) 給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N−1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。 輸入格式: 輸入第1行給出2個整數N(0

C++ 深度優先搜尋廣度優先搜尋實現

06-圖1 列出連通集 (25 point(s)) 給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N−1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。 輸入格式: 輸入第1行給出2個整數N(

無向及其深度優先搜尋廣度優先搜尋

無向圖 圖(Graph)是表示事物與事物之間的關係的數學物件,是數學領域的重要分支——圖論(Graph Theory)的研究物件。圖論中的圖是由若干給定的點及連線兩點的線所構成的圖形,這種圖形通常用來描述某些事物之間的某種特定關係,用點代表事物,用連線兩點的線表示相應兩個事

python實現深度優先搜尋廣度優先搜尋

1. 深度優先搜尋介紹 圖的深度優先搜尋(Depth First Search),和樹的先序遍歷比較類似。 它的思想:假設初始狀態是圖中所有頂點均未被訪問,則從某個頂點v出發,首先訪問該頂點,然後依次從它的各個未被訪問的鄰接點出發深度優先搜尋遍歷圖,直至圖中所有和v有路徑相通的頂點都被訪問到。 若此時尚有

基於深度優先搜尋廣度優先搜尋java實現

       為了解15puzzle問題,瞭解了一下深度優先搜尋和廣度優先搜尋。先來討論一下深度優先搜尋(DFS),深度優先的目的就是優先搜尋距離起始頂點最遠的那些路徑,而廣度優先搜尋則是先搜尋距離起始頂點最近的那些路徑。我想著深度優先搜尋和回溯有什麼區別呢?百度一下,說回

深度優先搜尋廣度優先搜尋-python實現

                                                                                         參考程式碼:https://www.cnblogs.com/yupeng/p/3414736.ht

深度優先搜尋廣度優先搜尋的比較與分(轉

深度優先搜尋和廣度優先搜尋的深入討論   (一)深度優先搜尋的特點是: (1)無論問題的內容和性質以及求解要求如何不同,它們的程式結構都是相同的,即都是深度優先演算法(一)和深度優先演算法(二)中描述的演算法結構,不相同的僅僅是儲存結點資料結構和產生規則以及輸出要求。

樹的深度優先搜尋廣度優先搜尋

1、區別        1) 二叉樹的深度優先遍歷的非遞迴的通用做法是採用棧,廣度優先遍歷的非遞迴的通用做法是採用佇列。        2) 深度優先遍歷:對每一個可能的分支路徑深入到不能再深入為止,而且每個結點只能訪問一次。要特別注意的是,二叉樹的深度優先遍歷比較特殊,

深度優先搜尋廣度優先搜尋理解及經典例題(java)

簡介 深度優先搜尋和廣度優先搜尋應用得最多的是對圖的搜尋。深度優先即是沿著一條路一直走到底,然後進行回溯。而廣度優先則是優先搜尋所有相鄰的節點,再訪問所有相鄰節點的鄰節點。 圖的遍歷之 深度優先搜尋和廣度優先搜尋這篇文章中的兩幅圖做了非常清楚的描述:

深度優先搜尋廣度優先搜尋

(DFS)深度優先搜尋,虛擬碼如下: void DFS_search(Node root){ if(root==null) return; visit(root);//例如列印該結點。 root.visited=true;//visited 布林型別變數,用於標識該結

深度優先演算法廣度優先演算法(基於鄰接矩陣)

1.寫在前面   圖的儲存結構有兩種:一種是基於二維陣列的鄰接矩陣表示法。             另一種是基於連結串列的的鄰接表。   在鄰接矩陣中,可以如下表示頂點和邊連線關係:      說明:   將頂點對應為下標,根據橫縱座標將矩陣中的某一位置值設為1

鄰接表與鄰接矩陣的深度優先演算法廣度優先演算法

鄰接矩陣的深度優先演算法: #include<iostream> using namespace std; #define MAX 20 // 注:鄰接矩陣是圖的順序儲存方式 typed