【问题标题】:Algorithm to find the number of shortest paths求最短路径数的算法
【发布时间】:2014-09-12 21:53:40
【问题描述】:

给定一个无向(无长度)图 G=(V,E),|V|=n 和 |E|= m,以及两个顶点 v,w,求输出最短 v-w 路径数的算法在G中。运行时间应该是O(m+n)

我一直在解决这个问题,但很难让运行时间为 O(m+n)

由于该图既是无向图又是未加权的,因此我尝试过这种方式。使用 BFS 确定最短 v-w-path 的长度。然后使用 DFS 找到 v-w-shortest 路径的数量,使得两个节点连接并且路径的长度等于 BFS 的输出。 但是这个计划的运行时间是O(m+n)+O(m+n)。

我还尝试修改 Dijkstra 算法。当有一个节点加入到访问节点集合中时,存储最短路径的长度和最短路径的数量。而且我一直在计算运行时间。

【问题讨论】:

  • 你已经尝试了什么?
  • 当你发帖时,请说明你已经尝试过什么,所以看起来你只是在询问你的练习的答案,甚至没有首先搜索它,我确信这不是案例;)
  • 我假设边缘没有加权?
  • 您在寻找最短路径吗?还是所有可能的路径?
  • 对不起,这是我第一次使用这个网站。我会补充我的问题。

标签: algorithm path shortest


【解决方案1】:

此问题可能正在寻找对Dijsktra's algorithm 的修改。使用 Dijkstra 算法,您可以为每个节点维护到该节点的最短路径的长度,并根据到相邻节点的最短路径和从该相邻节点到该节点的简单链接的长度在节点处更新它有问题。

在每个节点上,您可以保留到它的最短路径的长度、可以在它之前的最短路径上的节点的表,以及到该节点的最短路径的数量,这应该是到这些邻居的最短路径数之和。当您找到到某个节点的新最短路径时,您要么删除所有这些信息(如果新的最短路径比以前短),要么更新该表中路径中倒数第二个节点的条目,如果新路径是与之前到该节点的最短路径的长度相同。

【讨论】:

  • 非常感谢。这很有帮助。你能告诉我更多关于运行时间的信息吗?我不擅长确定给定算法的运行时间,我真的很想学习如何去做。你能帮我解决吗?
  • 查看 Wikipedia 上的复杂性信息,您可以看到您只需要访问每个顶点一次,并且对于大型图,您花费大部分时间运行优先级队列计算来计算出哪个首先访问的顶点。当您访问一个顶点时,您需要添加或修改一个表条目并增加路径总和,或者可能清除一个表条目。清除表可能意味着删除许多条目,但如果您在创建每个条目时考虑此成本,这只是每个条目的少量成本。所以我怀疑所有这些额外的工作是否会影响 O(n) 成本。
【解决方案2】:

您可以使用修改后的 BFS 在 O(N) 中找到不同路径的数量。这是solution

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多