DFS 和 BFS 写在124题后

本文深入探讨了深度优先搜索和广度优先搜索两种图遍历算法,详细介绍了它们的概念、实现方法及应用场景,帮助读者理解这两种算法的区别与联系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


深度优先遍历图的方法是,从图中某顶点v出发(百度百科):
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。


广度优先搜索概念(百度百科):
已知图G=(V,E)和一个源顶点s,宽度优先搜索以一种系统的方式探寻G的边,从而“发现”s所能到达的所有顶点,并计算s到所有这些顶点的距离(最少边数),该算法同时能生成一棵根为s且包括所有可达顶点的宽度优先树。对从s可达的任意顶点v,宽度优先树中从s到v的路径对应于图G中从s到v的最短路径,即包含最小边数的路径。该算法对有向图和无向图同样适用。


实现方法类比(自己总结):
1.需要一个数据结构来记录每个节点是否被访问过,可以采用

### 关于DFSBFS算法的练习及相关解析 #### 一、DFS(深度优先搜索) DFS的核心思想是从某个起点开始,尽可能深地探索每一个分支,直到无法再深入为止。以下是几个经典的DFS目及其解析: 1. **岛屿数量** - **描述**: 给定一个由 '1' (陆地) '0' (水) 组成的二维网格,计算岛屿的数量。岛屿总是被水包围,并且是由相邻陆地连接而成的区域。 - **示例代码**: ```python def numIslands(grid): if not grid or not grid[0]: return 0 m, n = len(grid), len(grid[0]) visited = [[False]*n for _ in range(m)] def dfs(x, y): if x < 0 or x >= m or y < 0 or y >= n or grid[x][y] == "0" or visited[x][y]: return visited[x][y] = True directions = [(0,1),(1,0),(-1,0),(0,-1)] # 右 下 上 左 for dx, dy in directions: nx, ny = x + dx, y + dy dfs(nx, ny) count = 0 for i in range(m): for j in range(n): if grid[i][j] == "1" and not visited[i][j]: dfs(i, j) count += 1 return count ``` 这里通过递归的方式实现了DFS逻辑[^2]。 2. **迷宫问** - **描述**: 在给定的一个矩阵中,从起始点到达终点的所有路径数是多少? - **解析**: 使用DFS尝试每一条可能的路径,当遇到障碍物或超出边界时停止当前路径的扩展[^3]。 --- #### 二、BFS(广度优先搜索) BFS是一种逐层展开的搜索方式,适合解决最短路径类问。以下是几个典型的BFS目及其解析: 1. **克隆图** - **描述**: 给定无向连通图中一个节点的引用,返回其深拷贝(即克隆)。每个节点都含有一个 `val` (整数值)一个列表 `neighbors` 表示它的邻居节点。 - **示例代码**: ```python from collections import deque class Node: def __init__(self, val=0, neighbors=None): self.val = val self.neighbors = neighbors if neighbors is not None else [] def cloneGraph(node): if not node: return None queue = deque([node]) clones = {node: Node(node.val)} while queue: current = queue.popleft() for neighbor in current.neighbors: if neighbor not in clones: clones[neighbor] = Node(neighbor.val) queue.append(neighbor) clones[current].neighbors.append(clones[neighbor]) return clones[node] ``` 2. **腐烂橘子** - **描述**: 在一个二维网格中,有新鲜橘子腐烂橘子。每一分钟,任何与腐烂橘子相邻的新鲜橘子都会变质。求所有橘子全部腐烂所需的最少时间。 - **解析**: 利用队列记录每次需要处理的状态变化,逐步扩散感染范围直至没有新的可感染对象[^4]。 --- #### 三、综合应用实例 以下是一个结合了DFS/BFS的应用场景——图像染色问: - **输入**: 图像数组 `image`, 起始坐标 `(sr, sc)` 新颜色 `newColor`. - **目标**: 将与初始位置相同颜色的所有相连像素替换为指定的新颜色。 - **解决方案**: 如果旧颜色等于新颜色,则无需执行任何操作;否则可以通过DFSBFS完成任务。具体实现见上述“岛屿数量”的变形版本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值