Algorithm O(E+;V)算法计算给定图上两个节点之间的最短路径数

Algorithm O(E+;V)算法计算给定图上两个节点之间的最短路径数,algorithm,graph-theory,depth-first-search,breadth-first-search,Algorithm,Graph Theory,Depth First Search,Breadth First Search,当给定一个分别具有顶点和边| V |和| E |以及顶点u和t的图G时,编写一个O(| E |+| V |)算法来计算从u到t的最短路径数,即如果有5条长度为4的路径,其中长度4是从u到t的最短路径,则该算法将输出5 我知道该算法必须以某种方式合并DFS或BFS,因为它们的运行时都是O(| E |+| V |)运行时,但我有点卡住了。我试着实现一些东西,它将重复执行DFS,算法终止于t,但在决定哪些节点设置为已访问节点以及在每次迭代后重置哪些节点时出现了问题 提前谢谢 您可以使用广度优先搜索。对

当给定一个分别具有顶点和边| V |和| E |以及顶点u和t的图G时,编写一个O(| E |+| V |)算法来计算从u到t的最短路径数,即如果有5条长度为4的路径,其中长度4是从u到t的最短路径,则该算法将输出5

我知道该算法必须以某种方式合并DFS或BFS,因为它们的运行时都是O(| E |+| V |)运行时,但我有点卡住了。我试着实现一些东西,它将重复执行DFS,算法终止于t,但在决定哪些节点设置为已访问节点以及在每次迭代后重置哪些节点时出现了问题


提前谢谢

您可以使用广度优先搜索。对于每个顶点,跟踪:

  • 从u到该顶点的最短路径长度
    • 无论何时处理给定顶点,都要为尚未设置此属性的所有相邻顶点设置此属性
    • 这同时作为“已排队”标志:最初设置为哨兵值,如ɴɪʟ或∞, 并且对任何给定顶点只更新一次。因此,不需要单独的标志来跟踪访问的顶点
  • 从u到该顶点的最短路径数
    • 无论何时处理给定顶点,都会适当地增加其所有相邻顶点的此属性,这些相邻顶点从u开始的最短路径长度大于正在处理的顶点的最短路径长度
    • 请注意,对于某些顶点,将多次更新此属性,但这没关系,因为每个边只更新一次

这基本上是Dijkstra算法的一个变体。@WillemVanOnsem是的,我考虑过Dijskta的实现,但它没有o(| V |+| E | logE),因为必须创建一个优先级队列,并且每次都用天真的优先级队列实现(即从PQ中的所有顶点开始)更新它,它应该是o(V log(V)+E)。但是您不必从PQ中的所有顶点开始。@bjb568是的,但是您如何知道要包括哪些顶点,并且运行时是否仍然大于O(E+V)?Dijkstra算法使用优先级队列的原因是某些边比其他边更昂贵。这不是您的情况,因此您实际上不需要优先级队列—您可以使用普通的FIFO队列—Dijkstra算法简化为广度优先搜索。