Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在给定起始顶点和深度限制的循环有向图中寻找所有可能的路径_Algorithm_Data Structures_Graph_Directed Graph - Fatal编程技术网

Algorithm 在给定起始顶点和深度限制的循环有向图中寻找所有可能的路径

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)和允许的最大深度(例如: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伪算法,它跟踪它所经过的路径。当到达所需深度时,它注册路径,然后终止

类似以下内容(node.js样式语法):


希望这有助于

根据原始图形构建一个包含节点(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)