前言
這幾天複習圖論演算法,覺得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#):
publicclass
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...
深度優先搜尋與廣度優先搜尋
深度優先遍歷的主要思想就是 首先以乙個未被訪問過的頂點作為起始頂點,沿當前頂點的邊走到未訪問過的頂點 當沒有未訪問過的頂點時,則回到上乙個頂點,繼續試探訪問別的頂點,直到所有的頂點都被訪問。沿著某條路徑遍歷直到末端,然後回溯,再沿著另一條進行同樣的遍歷,直到所有的頂點都被訪問過為止。通過上面的圖例可...