Algorithm 在给定起始顶点和深度限制的循环有向图中寻找所有可能的路径
考虑下面给出的有向循环图 如果指定了起点(例如:顶点0)和允许的最大深度(例如:5),可以使用什么算法来查找所有可能的路径(注意:给定的顶点可以访问多次) 实现这个图问题最有效的算法是什么 下面给出了上图的一些可能路径,没有特定顺序(从顶点0开始,允许的最大深度为5)Algorithm 在给定起始顶点和深度限制的循环有向图中寻找所有可能的路径,algorithm,data-structures,graph,directed-graph,Algorithm,Data Structures,Graph,Directed Graph,考虑下面给出的有向循环图 如果指定了起点(例如:顶点0)和允许的最大深度(例如:5),可以使用什么算法来查找所有可能的路径(注意:给定的顶点可以访问多次) 实现这个图问题最有效的算法是什么 下面给出了上图的一些可能路径,没有特定顺序(从顶点0开始,允许的最大深度为5) 0->1->2->4->1->3 0->1->2->4->5->1 0->1->2->4->5->6 0->1->3->5->1->3 这将是一个增强的BFS伪算法,它跟踪它所经过的路径。当到达所需深度时,它注册路径,然后终止
- 0->1->2->4->1->3
- 0->1->2->4->5->1
- 0->1->2->4->5->6
- 0->1->3->5->1->3
希望这有助于根据原始图形构建一个包含节点(u,深度)和边(u,深度)到(v,深度+1)的新图形,然后只需到BFS/DFS即可找到从起始节点(u,0)到所有节点(x,maxDepth)的所有路径。我认为您只需增加BFS即可跟踪深度。当路径到达正确的深度时,将路径(保存在内存中)添加到路径集合中。请注意,您的问题是NP难问题。所以即使有一个算法解决方案,我要实现的算法会指数增长吗?沙皮罗亚科夫:我最初的想法是这样的,但对我来说,这似乎是一种非常野蛮的方法。有没有办法优化这个方法?谢谢你的快速回复:)我知道你的建议的基本意思。但复制品究竟将如何进入画面?是否因为同一节点可以访问多次?如果这就是你所暗示的,并且如果复制实际上是一种可能性,那么这个算法永远不会终止(当考虑一个有圈的图时)。无论如何,一个简单的解决方法是在推到
相关路径之前进行检查,对吗?@Ashera你是对的。不会有重复。我现在就编辑它
const requiredDepth = X
const relevantPaths = {}
const runBFS = (curNode, curPath = []) => {
if (crPath.length === requiredDepth) {
relevantPaths.push(curPath)
return
}
for (let neighbor of curNode.neighbors) {
const newPath = [ ...curPath, getEdge(curNode, neighbor) ]
runBFS(neighbor, newPath)
}
}
runBFS(root)