我有一个二分图。我将参考各个不相交集的红色节点和黑色节点。
我想知道如何找到一个连接的诱导子图,该子图最大化红色节点的数量,同时确保子图中的所有黑色节点的新化合价小于或等于2。 “诱导”意味着如果两个节点在原始图中连接并且都存在于子图中,则它们之间的边缘自动被包括在内。最后我想介绍非负边缘权重。
这可以简化为标准图算法吗?希望是一个具有已知复杂性和简单实现的人。
显然可以贪婪地制作一个子图。但这是最好的吗?
答案 0 :(得分:1)
我确信这个问题属于NP-complete class,因此没有简单的方法可以解决它。我建议你使用constraint satisfaction方法。有很多方法可以解决您的问题,例如混合整数编程,MaxSAT甚至pseudo-boolean constraints。
答案 1 :(得分:1)
不幸的是,这是NP难的,因此可能没有多项式时间算法来解决它。这是NP难问题Independent Set的减少,其中我们给出了图G =(V,E)(其中n = | V |和m = | E |)和整数k,以及任务是确定是否有可能找到一组k个或更多顶点,使得集合中没有两个顶点被边连接:
调用所有r_i R的集合,所有b_ij B的集合,所有c_ij C的集合,所有t_ij T的集合以及所有u_ij U的集合。
这里的一般想法是我们强制每个黑色顶点b_ij最多选择2个红色顶点中的1个r_i和r_j,它们对应于G中边(i,j)的端点。我们这样做是通过给每个这些b_ij顶点中有3个输出边,其中一个(t_ij1中的一个)是“必须” - 也就是说,任何t_ij1顶点不选择的解决方案都可以通过选择它,以及它连接的其他n个红色顶点(通过在t_ijk中的顶点和u_ijk中的顶点之间交替的“摆动路径”),去除r_i或r_j以恢复没有黑色顶点的属性3如有必要,可以在解决方案中使用更多邻居,然后根据需要通过从C中选择顶点来最终恢复连通性。 (c_ij顶点是“连接符”:它们的存在只是为了确保我们包含的R的任何子集都可以组成一个连接的组件。)
首先假设在G中存在大小为k的IS。我们将证明在H中存在至少m(n + 1)+ k个红色节点的连通感应子图X,其中每个黑色顶点具有X中最多的2个邻居。
首先,在X中包含来自R的k个顶点,这些顶点对应于IS中的顶点(这样的集合必须通过假设存在)。因为这些顶点形成了一个IS,所以B中没有顶点与它们中的多个顶点相邻,所以对于每个顶点b_ij,我们可以安全地将它添加,并且将从t_ij1开始的2n + 1个顶点的“摆动路径”添加到X中好。这些摆动路径中的每一个包含n + 1个红色顶点,并且有m个这样的路径(G中每个边缘一个),因此现在在X中有m(n + 1)+ k个红色顶点。最后,为了确保X连接后,每个顶点c_ij加上它,使得r_i和r_j都已经在X中:注意这不会改变X中红色顶点的总数。
现在假设在H中有一个连接的感应子图X至少有m(n + 1)+ k个红色节点,其中每个黑色顶点在X中最多有2个邻居。我们将证明有一个IS在G大小为k。
H中唯一的红色顶点是R中的红色顶点和T中的红色顶点.R中只有n个顶点,所以如果X不包含所有m个摆动路径,它必须至多有(m-1)(n + 1)+ n = m(n + 1)-1个红色顶点,与它至少有m(n + 1)+ k个红色顶点的假设相矛盾。因此,X必须包含所有m个摇摆的路径。这在X中留下k个其他红色顶点,它们必须来自R.这些顶点中没有两个可以与B中的相同顶点相邻,因为那个B顶点将与3个顶点相邻:因此,这些k个顶点对应于G中的IS。
由于IS的YES实例意味着构造的问题实例的YES实例,反之亦然,因此构造的问题实例的解决方案完全对应于IS实例的解决方案;由于构造显然是多项式时间,这就证明了你的问题是NP难的。