给定2d矩阵找到元素的最小总和,从而从每行和每列中选择一个元素?

时间:2016-06-21 16:09:41

标签: algorithm graph-algorithm hungarian-algorithm

找到n * n 2D矩阵的元素的最小和,这样我必须从每一行和每列中选择一个且只有一个元素? 例如

4  12 

6  6

如果我从行4中选择1,我也无法从列12中选择1,也可以从列1中选择4 + 6 = 10, 我只能从第2行第2列中选择6。

同样,最小总和为6,其中6 + 12 = 18来自第二行第二列

而非6其中4 + 12来自第二行第一列

也不允许O(n!),因为两者都来自同一行

我想到了蛮力,一旦我从行和列中选择元素,我就无法选择另一个,但这种方法是setTimeout

1 个答案:

答案 0 :(得分:4)

定理:如果在所有数字中添加或减去数字 矩阵的任何一行或一列的条目, 然后选择元素以获得所得矩阵的所需最小和 是选择相同的元素来获得原始矩阵所需的最小总和。

Hungarian Algorithmmin-cost flow问题的特例)使用此定理来选择满足问题中给出的约束的元素:

  1. 从其所有条目中减去每行中的最小条目 行。
  2. 从所有条目中减去每列中的最小条目 它的专栏。
  3. 通过适当的行和列绘制线条以便全部显示 包括成本矩阵的零个条目和最小数量 使用这样的行。
  4. 最佳性测试
    一世。如果覆盖线的最小数量是n,则可以进行零的最佳分配,并且我们完成了 II。如果覆盖线的最小数量小于n,则为最佳 零的分配尚不可能。在这种情况下,请继续执行步骤5.
  5. 确定任何行未涵盖的最小条目。减去 从每个未覆盖的行中输入此条目,然后将其添加到每个覆盖的行中 柱。返回第3步。
  6. 有关更好的理解,请参阅this example

    O(n 4 )(容易且快速实施)和O(n 3 )(更难实施)实现详细解释here