数据结构与算法 | 深搜(DFS)与广搜(BFS)_深搜广搜算法-CSDN博客
深度优先搜索理论基础
深搜和广搜的区别:
(通俗版)
- dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)。
- bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程。
二叉树的递归法,就是dfs。
二叉树的迭代法,就是bfs(广度优先搜索)。
所以dfs,bfs其实是基础搜索算法,也广泛应用与其他数据结构与算法中。
深度优先搜索(Depth First Search)
深搜dfs关键就两点:
- 搜索方向,是认准一个方向搜,直到碰壁之后再换方向
- 换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。
因为dfs搜索可一个方向,并需要回溯,所以用递归的方式来实现是最方便的。
回溯链接:C++学习/复习补充记录 --- 递归、回溯_c++中回溯是啥-CSDN博客
深搜三部曲
1、确认递归函数,参数
2、确认终止条件
3、处理目前搜索节点出发的路径
深搜代码模板:
//1、确认递归函数,参数 vector<vector<int>> result; // 保存符合条件的所有路径(存放结果组合的vector) vector<int> path; // 起点到终点的路径(单个组合结果) void dfs (图,目前搜索的节点) { if (剪枝条件) return;//剪枝 //2、确认终止条件 if (终止条件) { result.push_back(path);//存放结果; return; } //3、处理目前搜索节点出发的路径 for (选择:本层节点所连接的其他节点) { 处理节点;(做选择) dfs(图,选择的节点); // 递归 回溯,撤销处理结果(撤销选择) } }
(回溯撤销处理结果其实就是:撤回一步,回到上一步重新走另一个方向。)
广度优先搜索(Breadth First Search)
实际应用
输入数据的含义:
例一:
输入:graph = [[1,2],[3],[3],[]]
节点0可链接到的节点有:节点1,节点2;
节点1可链接到的节点有:节点3;
节点2可链接到的节点有:节点3;
节点3可链接到的节点有:无。
例二:
输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]
节点0可链接到的节点有:节点4,节点3,节点1;
节点1可链接到的节点有:节点3,节点2,节点4;
节点2可链接到的节点有:节点3;
节点3可链接到的节点有:节点4;
节点4可链接到的节点有:无。
1.1 所有可能的路径 (深搜)
给你一个有
n
个节点的 有向无环图(DAG),请你找出所有从节点0
到节点n-1
的路径并输出(不要求按特定顺序)
graph[i]
是一个从节点i
可以访问的所有节点的列表(即从节点i
到节点graph[i][j]
存在一条有向边)。
1