给你一个有 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
思路:图论基础及遍历算法 :: labuladong的算法小抄 (gitee.io)
类似多叉树的遍历,因为是无环图所以不需要visited,但是要求路径,所以需要path记录路径。
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph)
{
vector<int> path;
traverse(graph,0,path);
return res;
}
void traverse(vector<vector<int>>& graph,int s,vector<int>& path)
{
path.push_back(s);//添加结点s到路径中
int n=graph.size()-1;
if(s==n)
{
res.push_back(path);
path.pop_back();
return ;
}
for(int v:graph[s])
{
traverse(graph,v,path);
}
path.pop_back();//从路径中移出结点s
}
};
如果在压入正确路径后就直接返回,那么需要出掉最后一个元素
因为,如果直接返回,就直接进入for循环内部,回到遍历上一个结点的状态,那么就会少一次for循环后面的pop_back操作,需要补上。
if(s==n)
{
res.push_back(path);
path.pop_back();
return ;
}
如果在压入正确路径后不直接返回,那么就不要额外的操作
因为,如果不直接返回,就会在当前结点状态,出掉最后一个元素,然后再返回到遍历上一个结点的状态。
if(s==n)
{
res.push_back(path);
}