【bfs基础】①
?
bfs,即廣度優先搜索,主要通過隊列(queue)進行操作。
稍微解釋一下,隊列是一種基礎數據結構,其形態類似于一支長長的隊伍,大概如下:
在C++中,隊列的頭文件定義為:#include<queue>
隊列的聲明:queue<T1> q;
這樣就定義了一個數據類型為"T1"的隊列q。
成員函數及作用集合:
| q.size() | 訪問隊列q中的元素個數。不可寫成sizeof(q)或size(q) |
| q.push() | 會將一個元素a置入隊列q中 |
| q.front() | 返回隊列q內的第一個元素(也就是第一個被置入的元素)。(不可寫成front(q)) |
| q.pop() | 會從隊列q中移除第一個元素。(不可寫成pop(q)) |
隊列是一種非常常見的數據結構,最常用于bfs(廣度優先搜索)。
廣度優先搜索可以將其想象成水滴落入水面濺起了的一圈一圈的漣漪,是由一個起始點開始一圈一圈進行擴散搜索的。(請一定要自行想象這個過程,非常重要!)
就比如這樣一個丑陋的 圖:
從頂點1開始搜索,廣搜過程依次為:1-2-3-4-5-6-7-8.
從頂點1開始搜索,深搜過程依次為:1-2-3-5-7-8-4-6.
很明顯,廣搜是一次性把與當前頂點有連通關系的點全部搜索完了,才搜索更下一層。
這樣就可以很清楚的有深搜的思路并用代碼實現了:
偽代碼:
void bfs(起始點) {將起始點放入隊列中;標記起點訪問;while (如果隊列不為空){訪問隊列中隊首元素x;刪除隊首元素; for (x 所有相鄰點){if (該點未被訪問過且合法) {將該點加入隊列末尾;} } }隊列為空,廣搜結束; }例題:單向公路
例題:密碼鎖
今天就講到這里,后續會持續更新。
?
轉載于:https://www.cnblogs.com/moyujiang/p/11167778.html
總結
- 上一篇: linux解压war包的命令
- 下一篇: 模板 - 快速输入输出