forked from itcharge/LeetCode-Py
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
85 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,86 @@ | ||
|
||
|
||
## 1. 广度优先搜索简介 | ||
|
||
> **广度优先搜索算法**(Breadth First Search):简称为 BFS,又译作宽度优先搜索 / 横向优先搜索。是一种用于遍历或搜索树或图的算法。该算法从根节点开始,沿着树的宽度遍历树或图的节点。如果所有节点均被访问,则算法中止。 | ||
广度优先遍历类似于树的层次遍历过程。呈现出一层一层向外扩张的特点。先看到的节点先访问,后看到的节点后访问。遍历到的节点顺序符合「先进先出」的特点,所以广度优先搜索可以通过「队列」来实现。 | ||
|
||
## 2. 广度优先搜索过程演示 | ||
|
||
接下来我们以一个无向图为例,演示一下广度优先搜索的过程。 | ||
|
||
我们用邻接字典的方式存储无向图结构,对应结构代码如下: | ||
|
||
```Python | ||
# 定义无向图结构 | ||
graph = { | ||
"A": ["B", "C"], | ||
"B": ["A", "C", "D"], | ||
"C": ["A", "B", "D", "E"], | ||
"D": ["B", "C", "E", "F"], | ||
"E": ["C", "D"], | ||
"F": ["D"] | ||
} | ||
``` | ||
|
||
该无向图的结构如图左所示,图右为宽度优先搜索的遍历路径。 | ||
|
||
其对应的动态演示图如下所示。 | ||
|
||
## 3. 基于队列实现的广度优先搜索 | ||
|
||
### 3.1 基于队列实现的广度优先搜索实现步骤 | ||
|
||
1. `graph` 为存储无向图的字典变量,`start` 为开始节点。 | ||
1. 然后定义 `visited` 为标记访问节点的 set 集合变量。定义 `q` 为存放节点的队列。 | ||
1. 首先将起始节点放入队列 `q`中,即 `q.put(start)`。并将其标记为访问,即 `visited.add(start)`。 | ||
4. 从队列中取出第一个节点 `node_u`。访问节点 `node_u`,并对节点进行相关操作(看具体题目要求)。 | ||
2. 遍历与节点 `node_u` 相连并构成边的节点 `node_v`。 | ||
- 如果 `node_v` 没有被访问过,则将 `node_v` 节点放入队列中,并标记访问,即 `q.append(node_v)`,`visited.add(node_v)`。 | ||
6. 重复步骤 4 ~ 5,直到 `q` 为空。 | ||
|
||
### 3.2 基于队列实现的广度优先搜索实现代码 | ||
|
||
```Python | ||
from queue import Queue | ||
|
||
def bfs(graph, start): | ||
visited = set(start) | ||
q = Queue() | ||
q.put(start) | ||
while not q.empty(): | ||
node_u = q.get() | ||
print(node_u) | ||
for node_v in graph[node_u]: | ||
if node_v not in visited: | ||
visited.add(node_v) | ||
q.put(node_v) | ||
``` | ||
|
||
## 4. 广度优先搜索应用 | ||
|
||
### 4.1 岛屿的最大面积 | ||
|
||
#### 4.1.1 题目链接 | ||
|
||
- [695. 岛屿的最大面积 - 力扣(LeetCode)](https://leetcode-cn.com/problems/max-area-of-island/) | ||
|
||
#### 4.2.2 题目大意 | ||
|
||
给定一个只包含 `0`、`1` 元素的二维数组 `grid`,其中 `1` 代表岛屿,`0` 代表水。一座岛的面积就是上下左右相邻的 `1` 所组成的连通块的数目。 | ||
|
||
要求:计算出最大的岛屿面积。 | ||
|
||
#### 4.2.3 解题思路 | ||
|
||
#### 4.2.4 代码 | ||
|
||
```Python | ||
|
||
``` | ||
|
||
## 参考资料 | ||
|
||
- 【文章】[广度优先搜索 - LeetBook - 力扣(LeetCode)](https://leetcode-cn.com/leetbook/read/bfs/e69rh1/) | ||
|