当前位置: 首页 > 知识库问答 >
问题:

枚举有向无环图中的所有路径

张腾
2023-03-14

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

共有3个答案

卞嘉许
2023-03-14

我的想法是扩展所有的路径,当没有候选路径时,从插入第一条边开始,然后通过扩展路径集合中的每条边在头部、尾部继续,或者当考虑的边产生分歧(冲突路径)时,分割一条路径。

这是一种基于稳定性思想的迭代方法:每次都考虑所有边缘,如果在一个回合中没有动作可做,那么转弯是稳定的,没有更多的工作要做。这种方法需要注意的一件事是不要太快地分叉路径:第一个转弯是准备转弯,因此分叉阶段仅在下一个转弯处处于活动状态。我正在评估交替前叉和延长阶段是否更好(我的意思是:更正确),并将stable_turn视为稳定的几圈

代码如下:

https://gist . github . com/daniele Cr/6 Abd 8 ad 48461347238 ad 1 caf 3714 fe6a

(抱歉,这是javascript,不太容易阅读,但我需要这种语言的版本)

秦俊豪
2023-03-14

下面是一个简短的python示例,通过修改DFS来实现这一点:

data = {1 : [2,3],   # Directed acyclic graph adjacency list
        2 : [3],
        3 : [4,5],
        4 : [5],
        6 : [7,8]}   # These nodes are disconnected from the rest of the graph

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

def enumerate_paths(graph):
    nodes = list(graph.keys())
    all_paths = []
    for node in nodes:
        node_paths = dfs(graph, [node], [])
        all_paths += node_paths
    return all_paths

输入:

enumerate_paths(data)

输出:

[[1, 2, 3, 4, 5], [1, 2, 3, 5], [1, 3, 4, 5], [1, 3, 5], [2, 3, 4, 5], [2, 3, 5], [3, 4, 5], [3, 5], [4, 5], [6, 7], [6, 8]]
别兴国
2023-03-14

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

你可以检查代码http://pastebin.com/p6ciRJCU

 类似资料:
  • 我有一个带有邻接矩阵形状的图()。我当前的问题是找到从源()到目标()的路径长度列表(节点顺序并不重要)。 我对寻找路径序列不感兴趣;我只对传播路径长度感兴趣。因此,这不同于找到所有简单的路径——这太慢了(即。找到从源到目标的所有路径;然后给每条路径打分)。有没有一种表演方法可以快速做到这一点? 建议将DFS作为一种可能的策略(此处注明)。我当前的实施(如下)根本不是最优的:

  • 给出了一个边上具有任意权的有向无环图和两个特定结点s和t,其中s的内度和t的外度为0。如何确定成本为正的s到t的最短路径?

  • 我有一个无向图,我想从一个起始节点列出所有可能的路径。2个节点之间的每个连接在列出的路径中是唯一的,例如,给出以下图表示: 我无法使用现有的算法来完成它,我知道像DFS。任何帮助都将非常感谢。

  • 我想在有向(无环)图中找到最长的路径。假设我知道起始节点-汇。路径应该从这一点开始。我在想我可以将边的权重设置为-1。有很多方法可以找到所有最短的路径,但你必须通过终点。有没有可能得到最短的路径(无论最终节点如何)? 假设我想为节点 nr 1(汇)找到最长路径。所以这个算法给了我1-2-3-4-5-6。

  • 我在这里要问的问题以前在堆栈溢出中已经被问过了。但我无法正确理解Skiminok发布的解决方案。 这是链接。 我尝试了上面链接上发布的解决方案,并给出了两个示例测试用例,但我无法得到正确的答案。 对于测试用例 1:: N=3 和 K=2 5 4 7 DAG将会是: 注:我构建上述DAG时考虑到: 设pi和pj是两个不同的问题。然后,我们将从pi到pj绘制一条有向边,当且仅当pj可以在pi之后的同一