【发布时间】:2017-03-03 05:48:32
【问题描述】:
我有一个算法问题,有一个简单的解决方案,但这似乎很浪费。我想知道是否有更有效的方法来做同样的事情。
问题来了:
- 输入:一个大图
G,具有非负边权重(解释为长度)、一个顶点列表v,以及一个与v长度相同的距离列表d。 - 输出:
G的子图S包含与v[i]的距离最多为d[i]的所有顶点(对于某些i)。
显而易见的解决方案是使用 Dijkstra 的算法,从每个 v[i] 开始,修改为在达到 d[i] 的距离后退出,然后对每个搜索遍历的子图进行联合。但是,在我的用例中,v[i]s 中的搜索树经常会出现大量重叠。这意味着 Dijkstra 方法将在我采用并集之前多次浪费地遍历重叠中的顶点。
在v 中只有一个顶点的情况下,Dijkstra 方法在O(|S|log|S|) 中运行,以|S| 为顶点数(我的图是稀疏的,所以我忽略了边项)。当v 有多个顶点时,是否可以实现相同的渐近运行时间?
我的第一个想法是将每个v[i] 中的搜索合并到相同的优先级队列中,但上面提到的“纾困”条件使这种方法复杂化。有时,一个顶点会在距离一个v[i] 更短的距离内到达,但如果第二个顶点分配了一个更大的d[j],您仍然希望从另一个v[j] 搜索它。
谢谢!
【问题讨论】:
-
如果 d 包含无穷大且 v 包含 G 中的每个顶点,则总输出将为 O(|S|*|S|)。你不能指望算法比这更有效。