我有一个无向的正边缘权重图(V,E)我想要一个覆盖顶点 k 顶点的最小生成树 V (Steiner树问题)。
我不是将生成树的大小限制为 k 顶点;而我确切地知道哪些 k 顶点必须包含在MST中。
从整个MST开始,我可以削减边缘/节点,直到我得到包含所有 k 的最小MST。
我可以使用Prim的算法来获取整个MST,并在子集k的MST未被破坏时开始删除边/节点;或者我可以使用Floyd-Warshall获得所有对最短路径并以某种方式结合路径。有没有更好的方法来解决这个问题?
答案 0 :(得分:13)
这里发生了很多混乱。根据OP的说法:
我没有将生成树的大小限制为k个顶点;而且我确切地知道哪些 k 顶点必须包含在MST中。
这是图上的Steiner树问题。 这不是k-MST问题。 Steiner树问题定义如下:
给定加权图G =(V,E),顶点的子集S⊆V, 根r∈V,我们想找到一个连接S中所有顶点的最小权重树 河 1
正如其他人所提到的,这个问题是NP难的。因此,您可以使用近似算法。
早/简近似算法
两种着名的方法是 Takahashi的方法和 Kruskal的方法(两者都由Rayward-Smith扩展/改进):< / p>
Takahashi的最短路径近似(由Rayward-Smith修改)
Kruskal的近似算法(由Rayward-Smith修改)
现代/更高级的近似算法
在生物学方面,最近的方法已经使用腔体方法处理了这个问题,这导致了一种改进的信念传播方式。在大型数据集上表现出良好准确性的方法:
在搜索引擎问题的背景下,方法关注的是非常大的数据集的效率,可以在一定程度上进行预处理。
答案 1 :(得分:11)
你说的问题是一个着名的NP难题,叫Steiner tree in graphs。在多项式时间内没有已知的解,许多人认为不存在这样的解。
答案 2 :(得分:2)
在限制图( k , E')上运行Prim的算法,其中 E' = {( x , y )∈ V : x ∈ k 和 y ∈ķ})。构造该图需要O(| E |)。