【发布时间】: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