深度优先搜索dfs

深度优先搜索dfs

深度优先搜索(Depth First Search)

简单来说就是一直往下走,走不通回头,换条路再走,直到无路可走

DFS是可用于遍历树或者图的搜索算法,DFS与回溯法类似,一条路径走到底后需要返回上一步,搜索第二条路径。在树的遍历中,首先一直访问到最深的节点,然后回溯到它的父节点,遍历另一条路径,直到遍历完所有节点。图也类似,如果某个节点的邻居节点都已遍历,回溯到上一个节点。

797. 所有可能的路径 - 力扣(LeetCode)

给你一个有 `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路径中插入节点,并且进入下一层递归,若到最后一个节点需要进行撤销的回溯操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度优先搜索DFS)可以用于寻找有向图中的环路。在DFS过程中,如果遇到了已经访问过的节点,且该节点不是当前节点的父节点,那么就说明存在环路。 具体的实现可以使用递归函数来进行DFS遍历,并使用一个visited数组来记录每个节点是否已经访问过。在遍历到某个节点时,先将其标记为已访问,然后遍历其所有的邻居节点。如果邻居节点已经被访问过并且不是当前节点的父节点,则说明存在环路,直接返回true。如果邻居节点没有被访问过,则递归遍历该节点,如果返回true,则说明存在环路,直接返回true。遍历完所有邻居节点后,将当前节点标记为已完成,并返回false。 具体的代码实现如下: bool hasCycle(vector<vector<int>>& graph, int start, vector<bool>& visited, vector<bool>& completed) { visited[start] = true; for (int i = 0; i < graph[start].size(); i++) { int neighbor = graph[start][i]; if (visited[neighbor] && !completed[neighbor]) { return true; // found cycle } if (!visited[neighbor] && hasCycle(graph, neighbor, visited, completed)) { return true; // found cycle } } completed[start] = true; return false; // no cycle found } bool hasCycle(vector<vector<int>>& graph) { int n = graph.size(); vector<bool> visited(n, false); vector<bool> completed(n, false); for (int i = 0; i < n; i++) { if (!visited[i]) { if (hasCycle(graph, i, visited, completed)) { return true; } } } return false; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值