思路:
看懂题目意思就不难:
graph[i]:表示结点 i ,示例中 结点 为 0 1 2 3,所以 i的大小 i = graph.size()-1;
graph[i][j]:表示结点 i 可以到达的结点:比如 graph[0][1] 表示结点 0 可以到达结点 1 ;
显然所有路径问题用dfs解决:
递归元素,肯定就是每一次循环用到的结点编号:
第一次 用 结点0 ,然后看结点0 能到达哪些结点,从中选取一个结点 重复上述步骤;
结束的条件就是 这次的 结点编号 就是我们要找的编号,这个时候就返回,看看有没有其它的情况;
注意:本题不需要记录遍历的结点是否会重走,显然每到达终点的所有路径都是唯一的,无须记录。
代码:
class Solution {
public:
vector<vector<int>>resultpath;
vector<int>pathnum;
void dfs(vector<vector<int>>& graph,int target,int num)
{
if(target==graph.size()-1)
{
resultpath.push_back(pathnum);
return;
}
for(int i=0;i<graph[num].size();i++)
{
target=graph[num][i];
pathnum.push_back(target);
dfs(graph,target,target);
pathnum.pop_back();
}
}
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
//vector<int>used(graph.size(),0);
pathnum.push_back(0);
dfs(graph,0,0);
return resultpath;
}
};