Algorithm 从多个顶点最大距离内提取子图的有效算法

Algorithm 从多个顶点最大距离内提取子图的有效算法,algorithm,graph,Algorithm,Graph,我有一个算法问题,有一个简单的解决方案,但它似乎是浪费。我想知道是否有更有效的方法来做同样的事情 问题是: 输入:具有非负边权重(解释为长度)的大型图形G、顶点列表v、距离列表d与v长度相同 输出:G的子图S,由距离v[i]最远的所有顶点组成,对于某些i 显而易见的解决方案是使用Dijkstra的算法,从每个v[i]开始,经过修改,使其在到达d[i]距离后退出,然后取每个搜索遍历的子图的并集。然而,在我的用例中,v[i]s中的搜索树经常重叠。这意味着Dijkstra方法将在进行并集之前浪费地

我有一个算法问题,有一个简单的解决方案,但它似乎是浪费。我想知道是否有更有效的方法来做同样的事情

问题是:

  • 输入:具有非负边权重(解释为长度)的大型图形
    G
    、顶点列表
    v
    、距离列表
    d
    v
    长度相同
  • 输出:
    G
    的子图
    S
    ,由距离
    v[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]
搜索该顶点


谢谢

你可以用一次Dijkstra跑步的复杂性来解决这个问题

设D为D中距离的最大值

定义一个新的起始顶点,并将其边赋给v中的每个顶点

起始和v[i]之间的边的长度应设置为D-D[i]


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

如果D包含无穷大,v包含G中的每个顶点,则总输出将为O(| S |*| S |)。你不能期望算法的工作效率低于这个。