在图中查找所有可能的路径
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在图中查找所有可能的路径相关的知识,希望对你有一定的参考价值。
我正在寻找一些算法来帮助我找到图中所有可能的路径。到目前为止我发现的一切并不完全令人满意。
让我们使用像广度优先搜索或深度优先搜索这样的算法。作为回报,我们会得到类似的东西
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
}
答案
只需折叠结果并计算新的可能性:结果= 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
另一答案
您可以在二叉树上使用此算法打印出所有的根到叶路径。函数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)
以上是关于在图中查找所有可能的路径的主要内容,如果未能解决你的问题,请参考以下文章
在 Go 中回溯以查找有向无环图中的所有路径,将路径分配给解决方案切片的问题(Leetcode 797)