【问题标题】:Finding all possible paths in a cyclic directed graph given a starting vertex and a depth limitation在给定起始顶点和深度限制的情况下查找循环有向图中的所有可能路径
【发布时间】:2020-04-19 11:19:44
【问题描述】:

考虑下面给出的有向循环图;

如果指定了起点(例如:顶点 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

【问题讨论】:

  • 根据原图构建一个新图,节点(u,depth)和从(u,depth)到(v,depth +1)的边,然后只到BFS/DFS找到所有路径从起始节点 (u,0) 到所有节点 (x, maxDepth)
  • 我认为你可以增加一个 BFS 来跟踪深度。当它达到正确的深度时,将路径(保存在内存中)添加到路径集合中。
  • 请注意,您的问题是 NP 难题。请参阅this、this 和 this。
  • @LiorKogan 因此,即使可能有算法解决方案,我将要实现的算法会成倍增长吗?我将查看什么样的时间复杂度?
  • @shapiroyaacov 我最初的想法是这样,但这对我来说似乎是一种非常暴力的方法。有什么方法可以优化方法吗?

标签: algorithm data-structures graph directed-graph


【解决方案1】:

为此的伪算法将是一个增强的 BFS,它跟踪它所经过的路径。当它达到所需的深度时,它会注册路径然后终止。

类似这样的东西(node.js 风格的语法):

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)

希望对你有帮助

【讨论】:

  • 感谢您的快速回复:) 我了解您的建议。但是复制品究竟是如何出现的呢?是不是因为同一个节点可以多次访问?如果这就是您所暗示的,并且如果实际上有可能重复,则此算法将永远不会终止(在考虑具有循环的图时)。无论如何,一个简单的解决方法是在推送到relevantPaths 之前进行检查,对吗?
  • @Ashera 你是对的。不会有重复。我现在会编辑它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
相关资源
最近更新 更多