我有连通的无向图G =(V,E),集合S = {S_1,S_2,...,S_n},其中每个S_i是V的子集,并且k> 1。 1.如何将V分割为k个子集,以保证:
答案 0 :(得分:6)
施密纳森林问题是,给定加权图G =(V,E)和顶点对(s 1 ,t 1 ),...,(s m ,t m ),找到G中最轻的边 - 子图H,使得对于所有i,顶点s i 和t i 属于H的相同连通组件。
您的问题的决定版本本质上是具有单位权重的Steiner林的决策版本。不幸的是,这个特殊情况仍然是NP难的。
从Steiner森林的特殊情况到您的问题的减少是,给定Steiner森林的未加权实例以及确定是否存在最多成本c的解决方案的指令,使用相同的图形创建问题的实例, k = | V | - c,并且,对于所有i,让S i = {s i ,t i }。如果存在最多成本的Steiner林c,则林的连通组件是您的子集,其数量至少为| V | - c = k。相反,如果您的问题实例有解决方案,那么我们可以在您的每个子集中找到生成树,总成本最多为| V | - k = c。
已知的最佳近似比为2,如果k很小,这对你没有多大帮助。你可能不得不使用分支和绑定。
答案 1 :(得分:0)
一些随机观察。 您可能无法加入两个S_i,S_j,因为它们不会形成连接的子图。由于图表是连接的,如果你只是添加了足够的其他S_k,你总是可以连接它们 - 最终你会得到根据定义连接的完整图形。因此,连接要求促使您进行合并。然而,k子集的要求驱使你将事物分开。基本上,你有一个n ^ k搜索空间,如果你跟踪这些条件,你可以从根本上修剪。当然,如果你没有S中的“免费”节点,那就完全改变了游戏。
是的,不是一个真正的答案,而是一个开头。无论如何会发布;)