演算法之寬度搜尋和深度搜尋

2021-08-15 10:12:13 字數 1455 閱讀 3815

寬度優先搜尋

定義:寬度優先搜尋演算法(又稱廣度優先搜尋)是最簡便的圖的搜尋演算法之一,這一演算法也是很多重要的圖的演算法的原型。dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和寬度優先搜尋類似的思想。其別名又叫bfs,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜尋整張圖,直到找到結果為止。

之所以稱之為寬度優先演算法,是因為演算法自始至終一直通過已找到和未找到頂點之間的邊界向外擴充套件,就是說,演算法首先搜尋和s距離為k的所有頂點,然後再去搜尋和s距離為k+l的其他頂點。

一、初始結點入隊,進入迴圈

二、取出佇列的第乙個元素

三、判斷該結點是不是目標結點,如果是目標結點,則問題解決,跳出迴圈

四、如果該結點不是目標結點,判斷其是否能夠擴充套件,若不能,跳到步驟二

五、如果該結點能擴充套件,將其子結點放入佇列的尾部

六、跳到步驟二

經典問題(走迷宮)

給定乙個二維陣列

inta[10][10] = ;

它表示乙個迷宮,其中

「1」代表牆,

「0」代表通路,只能橫著走或豎著走,要求編寫程式找出從左上角到右下角的最短路徑的長度

#includeusing namespace std ;

int dx = ;

int dy = ;

int m , n ;

int map[10][10] ;

int visit[10][10] = ;

typedef struct node node;

bool is_ok(node cur)

void bfs()

for(int i = 0 ; i < 4 ; i++) }}

}int main()

深度優先搜尋(dfs)

定義:與寬度優先搜尋相對,(英語:depth-first-search,簡稱dfs)是一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源節點並重複以上過程,整個程序反覆進行直到所有節點都被訪問為止。屬於盲目搜尋。(摘自wiki百科)

基本思路

深度優先遍歷圖的方法是,從圖中某頂點v出發:

(1)訪問頂點v;

(2)依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;

(3)若此時圖中尚有頂點未被訪問,則從乙個未被訪問的頂點出發,重新進行深度優先遍歷,直到圖中所有頂點均被訪問過為止。 當然,當人們剛剛掌握深度優先搜尋的時候常常用它來走迷宮.事實上我們還有別的方法,那就是上面說的廣度優先搜尋(bfs).

深度優先搜尋與寬度優先搜尋

深度優先搜尋類似於樹的先序遍歷,從每個頂點開始深度優先遍歷,對該分支路徑深入遍歷到不能再深入為止,返回上層,若上一層有新的分支路徑,繼續遍歷該分支,直到所有點都被訪問 1 訪問該頂點,並標記為已訪問 2 if 該頂點的連線點未被訪問過 遞迴呼叫dfs 3 重複 2 直到該頂點的所有連線點都被訪問 t...

演算法之深度優先搜尋和廣度優先搜尋

深度優先搜尋演算法 depth first search 是搜尋演算法的一種。它沿著 樹的深度 遍歷樹的節點,盡可能深的 搜尋樹的分支。當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個...

深度搜尋和廣度搜尋

這篇部落格很早之前就寫好了,但是一直沒有發出來。在進行詳細解說之前,我們需要先借用圖的概念,圖就是由一些小圓點 稱為頂點 和連線這些小圓點的直線 稱為邊 組成的。如下圖是由5個頂點 1,2,3,4,5 和5 條邊 1 2,1 2,1 4,2 5,3 4 組成的。現在我們從一號頂點開始遍歷這個圖,使用...