深度优先搜索dfs
深度优先搜索(Depth First Search)
简单来说就是一直往下走,走不通回头,换条路再走,直到无路可走
DFS是可用于遍历树或者图的搜索算法,DFS与回溯法类似,一条路径走到底后需要返回上一步,搜索第二条路径。在树的遍历中,首先一直访问到最深的节点,然后回溯到它的父节点,遍历另一条路径,直到遍历完所有节点。图也类似,如果某个节点的邻居节点都已遍历,回溯到上一个节点。
给你一个有 `n` 个节点的 **有向无环图(DAG)** ,请你找出所有从节点 `0` 到节点 `n-1` 的路径并输出(**不要求按特定顺序**)
`graph[i]` 是一个从节点 `i` 可以访问的所有节点的列表(即从节点 `i` 到节点 `graph[i][j]`存在一条有向边)。
输入: graph = [[1,2],[3],[3],[]]
输出: [[0,1,3],[0,2,3]]
解释: 有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3
利用dfs算法
class Solution {
private:
//有向无环图
vector<vector<int>> res ;
vector<int> path;
//使用深搜
//x为目前遍历的节点
void dfs(vector<vector<int>>& graph, int x )
{
if(x==graph.size()-1)
{
res.push_back(path);
return ;
}
//遍历所有的节点
for(int i=0;i<graph[x].size();i++)
{
path.push_back(graph[x][i]);//将节点加入path中
dfs(graph,graph[x][i]);//到第二个节点进入下一层递归
path.pop_back(); //回溯,撤销本节点
}
}
public:
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
path.push_back(0);
dfs(graph,0);
return res;
}
};
总结:
在递归的终止条件中,当目前节点x为最后一个节点时,插入并且返回;在递归的内存循环中,在每一层的path路径中插入节点,并且进入下一层递归,若到最后一个节点需要进行撤销的回溯操作。