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

2021-08-20 01:42:37 字數 1535 閱讀 9744

前言

這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。

廣度優先搜尋

有乙個有向圖如圖a

圖a廣度優先搜尋的策略是:

從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。

1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 = 。

2.然後確定頂點1的集合s1 = ,頂點2沒有鄰接點,所以集合為空。

3.然後確定3的鄰接點集合s3,因為2已經被遍歷過,所以不考慮,所以由頂點3知道的鄰接點集合s3 = 。

4.然後再確定頂點4的鄰接點集合,頂點4沒有更多的鄰接點了,此時也沒有還未遍歷的鄰接點集合,搜尋終止。

遍歷的路徑可以參考如下圖紅色標記的路徑:

動態過程

**的實現思路:

bfs()

}

深度優先遍歷

繼續以圖a為例

圖a深度優先遍歷的策略是:

從乙個頂點v出發,首先將v標記為已遍歷的頂點,然後選擇乙個鄰接於v的尚未遍歷的頂點u,如果u不存在,本次搜素終止。如果u存在,那麼從u又開始一次dfs。如此迴圈直到不存在這樣的頂點。

比如圖a中

1.從頂點0開始,將0標記為已遍歷,然後選擇未被遍歷的鄰接0的頂點1。

2.標記頂點1,然後選擇3並標記,然後選擇頂點3鄰接的頂點2。

3.頂點2標記後沒有與它鄰接的未標記的點,所以返回3選擇另乙個鄰接3並且未被標記的頂點4。

遍歷的路徑可以參考如下圖紅色標記的路徑:

動態過程

**的實現思路:

dfs(頂點v)

乙個簡單的應用

問題不贅述,具體可參考   leetcode朋友圈問題  。

實現的**如下(c#):

public

class

solution }}

public

void bfs(int [,]m,int visit,int

i) }}

}public

int findcirclenum(int

[,] m)

}return

circle;}}

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

深度優先搜尋 depth first search 簡稱dfs。最直觀的例子就是 走迷宮 廣度優先搜尋 每個頂點都要進出一遍佇列,每個邊也都會被訪問一次,所以 時間複雜度o v e 主要消耗記憶體的是visited prev陣列 queue佇列,所以 空間複雜度o v 深度優先搜尋 每條邊最多會被訪...

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

深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 package com.neusoft.data.structure 深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 public class dfsbfs 初始化 邊 mmatrix new int vlen vlen for...

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

深度優先遍歷的主要思想就是 首先以乙個未被訪問過的頂點作為起始頂點,沿當前頂點的邊走到未訪問過的頂點 當沒有未訪問過的頂點時,則回到上乙個頂點,繼續試探訪問別的頂點,直到所有的頂點都被訪問。沿著某條路徑遍歷直到末端,然後回溯,再沿著另一條進行同樣的遍歷,直到所有的頂點都被訪問過為止。通過上面的圖例可...