我有一个二分图G
。我想找到一个快速算法(渐近)来找到G
的所有顶点到两个集合X
和Y
的赋值,这样就可以得到集合{{}}形成的完整二分图{ {1}}和X
的边数尽可能多。
稍微长一点的解释:
Y
是二分的,由一组连通分量组成(显然每个都是二分的)。我们希望将每个组件的定位(缺少更好的词)决定为G
和X
。在确定了所有定位后,我们完成了二分图(即我们将Y
的每个顶点连接到X
的每个顶点)。然后我们计算出完全有多少边缘(包括原始边缘),我们想要最大化这个数量。简单的数学表明边数为Y
。
我对解决方案的思考过程:
随着组件数量的增加,|X|*|Y|
的选择数量呈指数增长。但是,如果我们将G
的连接组件的数量等于G
中的节点数,那么解决方案很简单 - 拆分以便G
和{{中的节点数量1}}相等(或在X
中奇数个节点的情况下几乎相等)。这使我想要概括说问题与尝试最小化Y
和G
的基数差异(可以在this SO question中解决)相同。但是,我没有成功证明这一点。
答案 0 :(得分:3)
让我们分解问题。
(U_i,V_i,E_i)
。|X|*|Y|
|X|*|Y|
的最大值,您显然需要使用全部
顶点(否则,通过添加另一个顶点,您将获得更大的值)。i
选择 - 如果您应将U_i
添加到X
,将V_i
添加到Y
- 或者反之亦然。所以,你实际上要做的是:
maximize:
sum { x_i * |V_i| : for each component i} * sum { y_i * |U_i| : for each component i}
subject to constraints:
x_i, y_i in {0,1} for all i
x_i + y_i = 1 for all i
我们想要最大化的值与函数f(x) = x(k-x)
的行为类似,因为如果我们增加|X|
,它会在减少|Y|
的范围内增加,并且数量相同。此函数具有单个最大值:
f(x) = xk - x^2
f'(x) = k - 2x = 0 ---> x = k/2
意思是,我们应该分配节点,使X
和Y
的基数(大小)尽可能彼此最接近(并使用所有顶点)。
这可以缩减为Partition Problem:
Given U_1,V_1,U_2,V_2,...,U_k,V_k
Create an instance of partition problem:
abs(|U_1| - |V_1|), abs(|U_2| - |V_2|), ... , abs(|U_k| - |V_k|)
现在,找到分区问题的最佳解决方案可以直接转换为U_i,V_i中的哪一个包含在哪个集合中,并确保大小差异保持最小。