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

时间:2019-04-17 21:13:25

标签: algorithm graph-theory depth-first-search breadth-first-search

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

我知道该算法由于其运行时而必须以某种方式合并DFS或BFS,因为它们各自具有O(| E | + | V |)运行时,但是我有点受阻。我尝试实现某种方法,使其可以重复执行DFS,算法以t终止,但这对于确定将哪些节点设置为已访问节点以及在每次迭代后重置哪个节点变得很困难。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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