算法 - 平衡断开的二分图

时间:2015-06-24 11:51:27

标签: algorithm graph-theory bipartite

我有一个二分图G。我想找到一个快速算法(渐近)来找到G的所有顶点到两个集合XY的赋值,这样就可以得到集合{{}}形成的完整二分图{ {1}}和X的边数尽可能多。

稍微长一点的解释

Y是二分的,由一组连通分量组成(显然每个都是二分的)。我们希望将每个组件的定位(缺少更好的词)决定为GX。在确定了所有定位后,我们完成了二分图(即我们将Y的每个顶点连接到X的每个顶点)。然后我们计算出完全有多少边缘(包括原始边缘),我们想要最大化这个数量。简单的数学表明边数为Y

我对解决方案的思考过程:

随着组件数量的增加,|X|*|Y|的选择数量呈指数增长。但是,如果我们将G的连接组件的数量等于G中的节点数,那么解决方案很简单 - 拆分以便G和{{中的节点数量1}}相等(或在X中奇数个节点的情况下几乎相等)。这使我想要概括说问题与尝试最小化YG的基数差异(可以在this SO question中解决)相同。但是,我没有成功证明这一点。

1 个答案:

答案 0 :(得分:3)

让我们分解问题。

  1. 您的图表实际上是一组连接的组件,每个组件都连接在一起 组件是(U_i,V_i,E_i)
  2. 要最大化边数,您需要最大化其值 |X|*|Y|
  3. 要获得|X|*|Y|的最大值,您显然需要使用全部 顶点(否则,通过添加另一个顶点,您将获得更大的值)。
  4. 您的选择自由实际上是为每个组件i选择 - 如果您应将U_i添加到X,将V_i添加到Y - 或者反之亦然。
  5. 所以,你实际上要做的是:

    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
    

    意思是,我们应该分配节点,使XY的基数(大小)尽可能彼此最接近(并使用所有顶点)。

    这可以缩减为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中的哪一个包含在哪个集合中,并确保大小差异保持最小。