【问题标题】:Enumerating all paths in a directed acyclic graph枚举有向无环图中的所有路径
【发布时间】:2013-11-28 09:50:45
【问题描述】:

是否有任何标准算法可以在有向无环图中找到所有可能的路径。 如果没有,我如何在 BFS/Dijkstra/任何其他算法中进行更改以枚举 DAG 中的所有路径

【问题讨论】:

标签: algorithm graph


【解决方案1】:

在指数中的任何图中查找所有可能的路径。它可以通过使用回溯来解决。 对于 DAG,我们可以使用深度优先搜索 (DFS) 来完成。 在 DFS 代码中,从任何节点开始,转到极端死胡同,并使用某个数组或列表记下该路径中访问的所有节点。一旦找到死胡同,打印包含访问节点的数组并弹出最后存储的节点并从第 (n-1) 个节点的另一条路径开始。如果第 (n-1) 个节点的所有路径都用尽,则从列表中弹出该节点并从 (n-2) 节点开始。这样做直到你到达所有死胡同并到达第一个节点。 所有打印的路径都是给定 DAG 中的路径。

您可以查看代码http://pastebin.com/p6ciRJCU

【讨论】:

  • 你能修改你给使用 BFS 而不是 DFS 的解决方案的解决方案吗?我在一次测试中被问到这个问题。我提议的是,如果弹出元素不是目标,则从队列中推送弹出元素的所有边缘。我想验证这是否正确。您的解决方案似乎是正确的。
  • 我不认为,我们可以使用 BFS 枚举所有路径。但是使用 DFS 是正确的想法,因为它与递归的工作方式同步。
  • 我尝试在几个案例中验证我的方法并且它工作正常。我仍然找不到任何拒绝 BFS 的具体理由。 BFS 和 DFS 只是访问顺序不同,这里不重要。您能否提供一个 BFS 方法失败的测试示例?
  • 你知道NetworkX是否可以做到这一点?
【解决方案2】:

下面是一个修改后的 DFS 的简短 Python 示例,以实现此目的:

data = {1 : [2,3],   # Directed acyclic graph adjacency list
        2 : [3],
        3 : [4,5],
        4 : [5]}

def dfs(data, path, paths = []):   
    datum = path[-1]              
    if datum in data:
        for val in data[datum]:
            new_path = path + [val]
            paths = dfs(data, new_path, paths)
    else:
        paths += [path]
    return paths

输入:

print dfs(data = data, path = [1], paths = []) # adjacency list; a list containing the node to start from; and initialize an empty list for all possible paths

输出:

[[1, 2, 3, 4, 5], 
[1, 2, 3, 5], 
[1, 3, 4, 5], 
[1, 3, 5]]

【讨论】:

  • 您能否概括一下您的解决方案,这样您就不必设置起点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 2022-01-21
  • 2011-09-25
相关资源
最近更新 更多