🔥博客主页: 我要成为C++领域大神
🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️本博客致力于知识分享,与更多的人进行学习交流
给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)
graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。
示例 1:
输入:graph = [[1,2],[3],[3],[]]
输出:[[0,1,3],[0,2,3]]
解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3
示例 2:
输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]
输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]
回溯法
思路
定义两个类成员变量,result
存储所有从节点0到节点n-1的路径的二维数组,path
存储当前正在构建的路径,是一个一维数组。
深搜三部曲:
参数:首先我们dfs函数一定要存一个图,用来遍历的,需要存一个目前我们遍历的节点,定义为x。
还需要存一个n,表示终点,我们遍历的时候,用来判断当 x==n 时候 标明找到了终点。
终止条件:当 x
== n
时,即当前路径到达目标节点,将当前的 path
加入到 result
中,并返回。
单层:对于节点 x
的每一个邻居节点 i
(通过 graph[x]
获得),将 i
加入 path
中,并递归调用 dfs(graph, i, n)
。
回溯:在递归返回后(即递归完毕或遇到终止条件后),需要将最后添加的节点 i
从 path
中弹出,以便探索其他可能的路径。
代码实现
class Solution {
public:
vector<vector<int>> result;//存储所有0~n-1的路径
vector<int> path;//符合要求的一条路径
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
path.push_back(0);//每一个路径都是从0开始的,所以将0存入
dfs(graph,0,graph.size()-1);
return result;
}
void dfs(vector<vector<int>>& graph,int x,int n)//x是当前遍历到的节点,n是目标节点
{
if(x==n)//说明当前路径到了目标节点,将path存入result
{
result.push_back(path);
return;
}
for(int i:graph[x]) //遍历二维数组每一层的元素
{
path.push_back(i);
dfs(graph,i,n);//继续向下递归
path.pop_back(); //回溯,存放下一层的路径。
}
}
};