【问题标题】:Efficient algorithm to extract a subgraph within a maximum distance from multiple vertices在距多个顶点的最大距离内提取子图的高效算法
【发布时间】: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|)。你不能指望算法比这更有效。

标签: algorithm graph


【解决方案1】:

您可以通过一次 Dijkstra 运行的复杂性来解决这个问题。

令 D 为 d 中距离的最大值。

定义一个新的起始顶点,并赋予它与 v 中每个顶点的边。

start和v[i]之间的边的长度应该设置为D-d[i]。

然后在这个新图中,S 由起始顶点长度 D 内的所有顶点给出,因此将 Dijkstra 应用于起始顶点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多