最近一直都在學習bfs演算法,故作此來梳理一下。
首先先介紹一下bfs,bfs(breadth-first-search)廣度優先搜尋,又稱為寬度優先搜尋,是圖的搜尋演算法之一。與深度優先搜尋不同的是,廣度優先搜尋會先搜尋到與起始點距離比較近的點,而深搜卻是沿著乙個分支遞迴到最後。
系統的扯一下~
給定圖g和乙個原點s,按照由近及遠的順序,bfs遍歷逐層訪問s可達的所有節點,並計算從s到各節點的距離(即s至各節點的路徑上的邊數),其中s至節點v的距離值:(v∈v)
1.當s與v間不連通時,d[v]=-1
2.當s與v間連通時,d[v]=s與v間的最短路長
初始的時候,d[s]=0,其他節點的d值為-1,廣度優先遍歷過程如下:
順序處理每個已訪問的節點u:遍歷訪問所有與u鄰接的未訪問的節點v((u,v)∈e,d[v]==-1)。由於u是v的父親或者前驅,因此v的距離值d[v]=d[u]+1。(劃重點,+1的原因)
由於是按照層次進行的,且通過「先進先出」的原則來實現,此時可以使用佇列(下篇博文會提及到)。擬定乙個佇列q,按照先後順序儲存被訪問過的節點,步驟如下:
1.首先源點s入佇列q,d[s]=0;
2.然後依次訪問所有與s相鄰的未被訪問過的節點v((u,v)∈e,d[v]==-1),d[v]=d[s]+1=1,並將v加入佇列q中;
3.接下來按照先進先出的原則來擴充套件隊首的節點,每擴充套件乙個隊首節點u,節點u出佇列,所有與u相鄰的未被訪問的節點v((u,v)∈e,d[v]==-1)入佇列q
其距離值為d[v]=d[u]+1;
4.依次類推,直至佇列q為空。
bfs遍歷從源點s出發,由近及遠,依次訪問和s有路徑相連且路長為1,2,3.....的節點,最終形成一顆以s為根的bfs遍歷樹。
其演算法如下:
void bfs(vlink g,int v)
取v的下乙個鄰接點w;}}
} bfs與dfs相比較:
深度優先搜尋用棧(stack)來實現:
1. 把起始頂點壓入棧中。
2. 每次從棧頂取出乙個頂點,搜尋所有它的未訪問相鄰頂點,把這些頂點壓入棧中。
3. 重複執行第二步操作,直至找到所要找的頂點或者棧為空時結束程式。
廣度優先搜尋使用佇列(queue)來實現:
1. 把起始頂點放到佇列中。
2. 每次從隊首取出乙個頂點,檢視這個頂點所有的未訪問相鄰頂點,把它們放到隊尾。
3. 重複執行第二步操作,直至找到所要找的頂點或者隊列為空時結束程式。
參考書籍:吳永輝老師,王建德老師,資料結構程式設計實驗第二版 機械工業出版社
演算法實驗三 (BFS 分支限界) 八數碼
時限 5000ms 記憶體限制 20000k 總時限 10000ms 描述在九宮格裡放在1到8共8個數字還有乙個是空格,與空格相鄰的數字可以移動到空格的位置,問給定的狀態最少需要幾步能到達目標狀態 用0表示空格 1 2 3 4 5 6 7 8 0 輸入輸入乙個給定的狀態。輸出輸出到達目標狀態的最小步...
Java的Web命名規範例子
前期寫了乙個關於婚慶的 捨不得仍掉。裡面的核心思想是關於頁面命名,目錄存放,命名規則,只要按有規律的模式命名檔案,這樣可以縮短程式設計開發的時間。下面舉兩個例子來說明其好處 如 名image p 001.png,這樣乙個專案中不用關心名稱問題,我們可以直接進目錄檢視即可,或者用eclipse裡面自帶...
BFS及DFS的Java實現
bfs 廣度優先遍歷,breadth first search 及dfs 深度優先遍歷,depth first search 是遍歷樹或圖的兩種最常用的方法。本文簡單的講解在面對樹或者圖的問題時,使用bfs及dfs解答題目時的思路及實現。根據上圖就可以很清晰的理解出bfs的概念,即一層一層的遍歷。在...