深搜解决有向无环图所有可能的路径

思路:

看懂题目意思就不难:

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;
    }
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值