代码随想录第六十一天——所有可能的路径

深度优先搜索

  1. dfs是朝一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就是回溯)
  2. 深度优先搜索的代码框架:
void dfs(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本节点所连接的其他节点) {
        处理节点;
        dfs(图,选择的节点); // 递归
        回溯,撤销处理结果
    }
}
  1. 深搜三部曲:
  • 确定递归函数及参数
  • 确定终止条件
  • 处理目前搜索节点出发的路径

广度优先搜索

  • 广搜(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;
    }
};

你可能感兴趣的:(深度优先,算法,数据结构,广度优先)