【问题标题】:How do I construct an efficient algorithm for finding vertex which is furthest from the set S of vertices?如何构造一个有效的算法来查找距顶点集 S 最远的顶点?
【发布时间】:2020-08-21 12:35:22
【问题描述】:

给定一个具有 n 个顶点和 m 个边的无向加权图。如何构造一个算法,它最多需要 O((n+m) log(n+m)) 来找到到一组顶点 S \in V 的最短路径距离的顶点最大化?

我知道我可以遍历所有顶点并使用 dijkstra 的算法找到 S 中每个顶点的最短路径,但这肯定会比 O((n+m) log(n+m)) 花费更多的时间。

【问题讨论】:

  • 使用 Dijkstra 算法的逆向查找从所有节点到目标集的最短路径。
  • @stark 对不起,我不明白。如果我们尝试在图中找到所有最短路径,不是需要 O(n^2*m) 吗?
  • DA 在 O(E logV) 时间内为 E 边、V 个顶点找到从一个节点到图中每个节点的最短路径。反向 DA 在同一 O 中从图中的每个节点找到到节点的最短路径。拥有多个目标节点只会影响初始化,而不是复杂性。
  • 对不起,如果我听起来像一个完整的新手,因为我是.. :) 但是我们的集合 S 可能相当大,(类似于 n/4)。如果我们需要遍历 S 中的所有顶点并在它们上运行反向 DA,那怎么能不影响复杂性呢?感谢您对我的帮助和耐心。
  • 典型的 DA 将数组设置为所有 -1,但一个节点设置为 0(与目标节点的距离)。您只需将 S 节点设置为 0 并初始化节点的起始列表以检查这些 S 节点的所有邻居。

标签: algorithm time-complexity dijkstra greedy divide-and-conquer


【解决方案1】:

我根据您的想法(可能使用 dijkstra 的最短路径算法)假设每条边的权重大于或等于零。

一个干净的解决方案是创建一个新顶点 v 并在 v 和 S 中的每个顶点之间添加零权重边。从 运行 dijkstra 算法v 并且您要寻找的答案是距离 v 最远的顶点。

您可以自己证明您的问题的解决方案等于在新图表上计算出的解决方案,因为它是直截了当的。此外,它只运行一次 dijkstra 算法,因此它适合您的时间复杂度限制。

【讨论】:

    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多