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
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 |)。你不能期望算法的工作效率低于这个。