【问题标题】:Finding all possible paths in graph在图中查找所有可能的路径
【发布时间】:2017-05-06 01:24:29
【问题描述】:

我正在寻找一些算法,它可以帮助我在图表中找到所有可能的路径。到目前为止,我发现的一切都完全令人满意。

假设我们有一个像这样的图(树):

让我们使用一些算法,例如广度优先搜索深度优先搜索。作为回报,我们会得到类似

1, 2, 4, (2), 5, (2), 6, (2), (1), 3, 7, 8, (7), 9

这就是我们通过这棵树的方式,这不是我要找的。我很想获得 所有 路径,例如:

1
1, 2
1, 2, 4
1, 2, 5
1, 2, 6
1, 3
1, 3, 7
1, 3, 7, 8
1, 3, 7, 9

问题是我只想指定 root 节点和算法应该能够为我提供任何长度的所有可能路径。


到目前为止,我的简单代码如下所示:

func dfs(_ graph: Graph, source: Node) -> [String] {
    var nodesExplored = [source.label]
    source.visited = true

    for edge in source.neighbors {
        if !edge.neighbor.visited {
            nodesExplored += dfs(graph, source: edge.neighbor)
        }
    }

    return nodesExplored
}

【问题讨论】:

  • 正如您所写的那样,BFS 或 DFS 是要走的路,只需对每一步更新路径进行细微修改,并确保您不会多次添加相同的路径(您可以使用设置来累积 Path 对象)。
  • 嗯,无向或循环图中的所有路径都是无限集。如果您实际上是在搜索用于在树中搜索的算法,您可能应该在问题中明确询问此类算法,而不是一般地询问树。
  • @Paul 这东西是一棵树,但在我的情况下可能有循环。例如,我们可以在节点 2 和 3 之间有边。

标签: algorithm graph-theory traversal depth-first-search breadth-first-search


【解决方案1】:

您可以在二叉树上使用此算法来打印出其所有从根到叶的路径。函数treePaths以深度优先(DFS)、预排序、递归方式遍历节点。

treePaths(root, path[1000], 0) // initial call, 1000 is a path length limit

// treePaths traverses nodes of tree DFS, pre-order, recursively
treePaths(node, path[], pathLen)
    1) If node is not NULL then 
        a) push data to path array: 
            path[pathLen] = node->data.
        b) increment pathLen 
            pathLen++
    2) If node is a leaf node, then print the path array, from 0 to pathLen-1
    3) Else
        a) Call treePaths for left subtree
            treePaths(node->left, path, pathLen)
        b) Call treePaths for right subtree.
            treePaths(node->right, path, pathLen)

【讨论】:

    【解决方案2】:

    只需折叠结果并计算新的可能性:Result = 9(您忘记了路径 [1])

    n0  n1  n2  n3
    1,   2,  4,       +3
        (2), 5,       +1
        (2), 6,       +1
        (2),          +0
    (1), 3,  7,  8,   +3
            (7), 9    +1
    

    【讨论】:

    • 不知道你会怎么做?我可以看到我当前的回报有我需要的一切,但我无法拆分它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    相关资源
    最近更新 更多