深度优先搜索
- dfs是朝一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就是回溯)
- 深度优先搜索的代码框架:
void dfs(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本节点所连接的其他节点) {
处理节点;
dfs(图,选择的节点); // 递归
回溯,撤销处理结果
}
}
- 深搜三部曲:
- 确定递归函数及参数
- 确定终止条件
- 处理目前搜索节点出发的路径
广度优先搜索
- 广搜(bfs)是一圈一圈的搜索过程,深搜(dfs)是一条路跑到黑然后再回溯。
- 广搜的搜索方式适合于解决两个点之间的最短路径问题。广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路
- 广搜使用队列或者栈记录已经遍历过的节点。
leetcode 797. 所有可能的路径
题目链接:所有可能的路径
class Solution {
private:
vector<vector<int>> res; // 收集符合条件的路径
vector<int> path; // 0节点到终点的路径
// x:目前遍历的节点
// graph:存当前的图
void dfs (vector<vector<int>>& graph, int x) {
// 要求从节点 0 到节点 n-1 的路径并输出,所以是 graph.size() - 1
if (x == graph.size() - 1) { // 找到符合条件的一条路径
res.push_back(path);
return;
}
for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点
path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来
dfs(graph, graph[x][i]); // 进入下一层递归
path.pop_back(); // 回溯,撤销本节点
}
}
public:
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
path.push_back(0); // 无论什么路径都是是从0节点出发
dfs(graph, 0); // 开始遍历
return res;
}
};