You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

有向循环图指定起点与深度限制下的全路径查找算法咨询

在有向循环图中查找指定起点和最大深度内的所有路径

嘿,这个问题挺典型的——在带环的有向图里找起点出发、不超过最大深度的所有路径(还允许重复访问节点),我来给你捋捋:

适用的基础算法

  • 深度优先搜索(DFS):这是最直接的选择。DFS会沿着一条路径一直钻到底,直到达到最大深度,然后回溯去探索其他分支。因为图里有环且允许重复访问节点,所以咱不需要标记节点是否已访问,只需要盯着当前路径的长度,一旦超过最大深度就停手就行。
  • 广度优先搜索(BFS):也能搞定,BFS会按路径的深度层级逐层遍历,每一层对应路径的长度,当层级超过最大深度时就停止。不过BFS需要存储每一条当前路径,路径多的时候内存消耗会比DFS大不少。

最高效的算法选择

如果追求时间和内存的综合效率,优化后的DFS通常是最优解——它的递归调用栈天然就存着当前路径,不需要像BFS那样每一层都复制大量路径副本。不过要注意几个优化点:

  1. 深度剪枝:一旦当前路径的边数(也就是路径长度)达到最大深度,直接把这条路径存入结果,不再继续递归。
  2. 避免无效递归:虽然因为允许重复访问,很难做复杂剪枝,但可以提前判断如果当前节点没有出边,直接终止这条分支的递归。

简单实现思路(伪代码)

用Python风格的DFS伪代码举个例子,一看就懂:

def find_all_paths(graph, start, max_depth):
    result = []
    def dfs(current_node, current_path):
        # 路径的边数 = 节点数 - 1,比如0->1是1条边,对应深度1
        if len(current_path) - 1 == max_depth:
            result.append(current_path.copy())
            return
        # 遍历当前节点的所有邻接节点
        for neighbor in graph.get(current_node, []):
            current_path.append(neighbor)
            dfs(neighbor, current_path)
            current_path.pop()  # 回溯,撤销选择
    # 从起点开始,初始路径只有起点
    dfs(start, [start])
    return result

这里的graph是邻接表格式,比如graph = {0: [1], 1: [2,3], 2: [4], ...}这样的结构。

对应你给出的例子验证

比如你提到的起点0、最大深度5的场景,DFS会这样遍历:

  • 从0出发走到1,再到2,再到4,此时可以选1或5:
    • 选1再走到3,路径长度刚好是5(0->1->2->4->1->3),符合条件加入结果;
    • 选5的话,又能选1或6:
      • 走到1,路径长度5(0->1->2->4->5->1),加入结果;
      • 走到6,路径长度5(0->1->2->4->5->6),加入结果;
  • 另外一条分支0->1->3->5->1->3,也是DFS在回溯过程中探索到的分支。

内容的提问来源于stack exchange,提问作者Ashera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:47:26