理论基础:深度优先搜索理论基础!
797. 所有可能的路径
1.自己的代码
class Solution {
public:
vector<int>path;
vector<vector<int>>result;
void dfs(vector<vector<int>>& graph, int x) {
if (x == graph.size() - 1) {
result.push_back(path);
return;
}
for (int i = 0; i < graph[x].size(); i++) {
path.push_back(graph[x][i]);
dfs(graph, graph[x][i]);
path.pop_back();
}
}
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
path.push_back(0);
dfs(graph, 0);
return result;
}
};
2.官方代码
class Solution {
private:
vector<vector<int>> result; // 收集符合条件的路径
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) { // 找到符合条件的一条路径
result.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 result;
}
};
3.深搜三部曲
1.确定递归函数和参数
除了题目给出的图以外,我们还需要一个参数来标记遍历到哪个位置来记录当前的位置的值,用x表示,一开始从0开始,所以值为0, x = 0
2.确定终止条件
当遍历的位置到达了终点时就结束了,因为这道题的数字是顺序的所以最终位置的值是graph.size() - 1,x == graph.size() - 1就为结束条件
3.确定目前搜索结点出发的路径
先要找当当前结点连接了那些结点
for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点
然后不断加入下一层的某一个结点,更新位置,当位置到达终点就结束。
最重要的就是x来标记现在到达的位置上的值来确定到没到达终点