构建覆盖顶点特定子集的最小生成树
我有一个无向的正边权重图(V,E),我想要一个最小生成树覆盖顶点V的子集k(斯坦纳树问题)。
我不是将生成树的大小限制为k个顶点, 而是我确切知道MST中必须包含哪些k个顶点。
从整个MST开始,我可以削减边缘/节点,直到获得包含全部k的最小MST。
我可以使用Prim的算法获得整个MST,并开始删除边缘/节点,而子集k的MST不被破坏; 或者我可以使用Floyd-Warshall来获得所有对最短路径并以某种方式合并路径。 有更好的方法来解决这个问题吗?
你所说的问题是一个着名的NP难题,在图中称为Steiner树。 多项式时间没有已知的解,许多人都认为没有这种解决方案。
这里有很多混乱。 根据OP的说法:
我不是将生成树的大小限制为k个顶点, 而是我确切知道MST中必须包含哪些k个顶点。
这是图表上的斯坦纳树问题。 这不是k-MST问题。 斯坦纳树问题的定义如下:
给定一个加权图G =(V,E),顶点的一个子集S⊆V和一个根r V,我们想要找到一个最小权重树,它将S中所有顶点连接到r。 1
正如其他人所说的,这个问题是NP难的。 因此,您可以使用近似算法。
早期/简单近似算法
两种着名的方法是高桥方法和克鲁斯卡尔方法 (这两种方法都由Rayward-Smith进行了扩展/改进):
高桥的最短路径近似(由Rayward-Smith修改)
Kruskal的近似算法(由Rayward-Smith修改)
现代/更高级的近似算法
在生物学中,最近的方法已经使用腔体方法处理了这个问题,这导致了“修正的置信传播”方法,该方法在大型数据集上显示出良好的准确性:
在搜索引擎问题的情况下,方法的重点在于可以在一定程度上预处理的非常大的数据集的效率。
在限制图(k,E')上运行Prim算法,其中E'= {(x,y)∈V:x∈k且y∈k})。 构造该图需要O(| E |)。
链接地址: http://www.djcxy.com/p/35259.html上一篇: Construct a minimum spanning tree covering a specific subset of the vertices